【知识点】

面向对象的三大特性:继承、多态、封装

【继承】

(1)继承:class Person(Animal): ——括号里的:父类,基类,超类   括号外的:子类,派生类

 class Animal:
def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age class Person(Animal):
pass p1=Person('小明','男',20)
print(p1.__dict__) # {'name': '小明', 'sex': '男', 'age': 20}

(2)初识继承:子类以及子类实例化的对象  可以访问父类的任何方法或变量

  #1、类名可以访问父类的所有东西

 class Animal:
breath='呼吸' def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age def eat(self):
print("动物都需要吃东西...") class Person(Animal):
pass print(Person.breath) # 呼吸 (用类名进行访问)
Person.eat(111) # 动物都需要吃东西... (类名访问方法)

  #2、子类实例化的对象也可以访问父类所有东西

 p1=Person('小明','男',20)
print(p1.breath) # 呼吸 (用子类实例化对象访问父类静态变量)
p1.eat() # 动物都需要吃东西... (用子类实例化对象访问父类方法)

  #3、查询顺序

(3)继承关系中执行方法

  #1、只执行父类的方法:子类中不要定义与父类用名的方法

  #2、只执行子类的方法,在子类中创建这个方法

  #3、既要执行父类中的方法也要执行子类中的方法?

    两种解决方法:

    ① 在自己的类中调用父类的__init__方法(Animal.__init__(self,name,sex,age)。

    并且,在自己的类中定义def __init__(self,name,sex,age,wing)  在下面添加self.wing=wing

 # 既要执行父类中的方法也要执行子类中的方法?
# 解决方法1:
class Animal: def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age def eat(self):
print("%s吃东西" % (self.name)) class Bird(Animal): def __init__(self,name,sex,age,wing):
# 类名调用方法需要全部参数,若是对象,不需要self
Animal.__init__(self,name,sex,age) #调用父类的__init__方法
self.wing=wing def bark(self):
print("唧唧叫") b=Bird('鹦鹉','公',20,'绿翅膀')
print(b.__dict__) # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}

    ②super(本类,self).__init__(name,sex,age)  #可以简写:super().__init__(name,sex,age)

 # 解决方法2:
class Animal: def __init__(self,name,sex,age):
self.name=name
self.sex=sex
self.age=age def eat(self):
print("%s吃东西" % (self.name)) class Bird(Animal): def __init__(self,name,sex,age,wing):
# 类名调用方法需要全部参数,若是对象,不需要self
#Animal.__init__(self,name,sex,age) #调用父类的__init__方法
super().__init__(name,age,wing) #简写 原本:super(Bird,self).__init__(name,sex,age)
self.wing=wing def bark(self):
print("唧唧叫") b=Bird('鹦鹉','公',20,'绿翅膀')
print(b.__dict__) # {'name': '鹦鹉', 'sex': '公', 'age': 20, 'wing': '绿翅膀'}

(4)继承的进阶

  继承:单继承、多继承

  类:经典类,新式类

  #1、新式类:凡是继承object类都是新式类

    python3x 所有的类都是新式类。 因为python3x中的类都默认继承object

  #2、经典类:不继承object类都是经典类

    python2x 所有的类默认都不继承object类,所有的类默认都是经典类

    ★在python2x中出现如下情况为新式类:

 class A(object):
pass

    因此,python2x中既有经典类也有新式类

  #3、单继承:新式类、经典类查询顺序一样(依次往上)

   #4、多继承:

     新式类:遵循广度优先

     经典类:遵循深度优先

    ①多继承新式类:class F(D,E):   查询类的继承顺序方法:print(类名.mro())

    一条路走到倒数第二级,然后判断,如果其他路能走到终点,则返回走另一条路,否则走到终点。(每个节点只走一次)

    ②多继承经典类:(一条路走到底)

  #5、继承的优点:

    节省代码,优化代码

    提高代码的复用性,提高代码的维护性,让类与类之间发生关系

【一道面试题】

 class A:
name = [] p1 = A()
p2 = A()
p1.name.append(1)
# p1.name,p2.name,A.name 分别是什么?

分析:一般说对象调用类中的静态变量是不能修改的。常规思路肯定认为这里会报错,但是这有个坑,静态变量是可变的数据类型。思路如下:

在名称空间里,A.name获取的是列表的内存地址(房间号),而往其中放入一个数,那是没有问题的。因此有如下结果

 class A:
name = [] p1 = A()
p2 = A()
p1.name.append(1)
# p1.name,p2.name,A.name 分别是什么?
print(p1.name) #[1]
print(p2.name) #[1]
print(A.name) #[1]

时间:2020-02-12     16:12:50

pyhon学习Day18--继承的更多相关文章

  1. Java学习笔记---继承和super的用法

    自从换了个视频教学,感觉比原来那个好多了,就是学校网速太渣,好多视频看一会卡半天,只能先看看已经下载的了. 不过也好,虽然不能从开始开始重新开,但是已经看过一次,在看一次也是好的,就当巩固学习了. 继 ...

  2. Exception类的学习与继承总结

    日期:2018.11.11 星期日 博客期:023 Exception类的学习与继承总结 说起来我们上课还是说过的!老师提到了报错问题出现主要分Exception和Error两类!第一次遇见这个问题是 ...

  3. C++学习15 继承权限和继承方式

    C++继承的一般语法为: class 派生类名:[继承方式] 基类名{ 派生类新增加的成员 }; 继承方式限定了基类成员在派生类中的访问权限,包括 public(公有的).private(私有的)和 ...

  4. css案例学习之继承关系

    代码 <html> <head> <title>继承关系</title> <style> body{ color:blue; /* 颜色 * ...

  5. java学习笔记-继承中super关键字

    背景: 在java继承的概念中我们得知,被声明为私有的类成员对所属的类来说仍然是私有的.类之外的任何代码都不能访问,包括子类. super关键字的两种用法: 1.用于调用超类的构造函数: 2.用于访问 ...

  6. JS高级程序设计学习笔记——继承

    我们知道,在OO语言中,继承可分为接口继承和实现继承.而ECMAScript的函数没有签名,不能实现“接口继承”,只能通过原型链实现“实现继承”. 在学习了各种继承模式之后,简单总结一下各种继承模式的 ...

  7. Java基础学习篇---------继承

    一.覆写(重写) 1.含义:子类的定义方法.属性和父类的定义方法.属性相同时候 方法名称相同,参数相同以及参数的个数也相同,此时为覆写(重写) 扩充知识点: 覆盖:只有属性名字和方法名字相同,类型.个 ...

  8. Java学习笔记--继承和多态(中)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  9. Java学习笔记--继承和多态(上)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  10. C++学习_继承覆盖重载

    今天通过对实验二继承,重载,覆盖的学习,让我更深一步理解了这些概念的区别. 首先来明确一个概念,函数名即地址,也就是说函数名就是个指针. 编译阶段,编译器为每个函数的代码分配一个地址空间并编译函数代码 ...

随机推荐

  1. 【题解】有标号的DAG计数1

    [HZOI 2015] 有标号的DAG计数 I 设\(f_i\)为\(i\)个点时的DAG图,(不必联通) 考虑如何转移,由于一个DAG必然有至少一个出度为\(0\)的点,所以我们钦定多少个出度为\( ...

  2. 洛谷$1220$ 关路灯 记搜/$DP$

    \(Sol\) 约定\(pos\)为老张所处的位置的路灯号,\(i<pos,j>pos\). 显然,如果\(i\)和\(j\)都关了,那么它们之间的所有灯一定也都关了. 设\(f[i][j ...

  3. JVM探秘:四种引用、对象的生存与死亡

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. Java虚拟机的内存区域中,程序计数器.Java栈和本地方法栈是线程私有的,随线程而生 ...

  4. centos下MySQL登录1045问题解决

    由于需要在centos下部署整个应用,自然少不了对数据库的操作.但很多人可能会遇到一些问题,比如创建用户成功,但是却无法登录. 无法登陆一般就两个原因.第一,远程访问端口没开,第二个原因就是密码错误了 ...

  5. 「P5004」专心OI - 跳房子 解题报告

    题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...

  6. 小小知识点(二十九)open access 和 classic access期刊出版形式分别指的是什么?

    open access: 作者付费,读者免费获取方式:相当于你给所有读者买单,就是交钱让你的文章可免费下载,很显然文章的被引用几率机会会提高.对于那些追求他引的单位,个别作者就得出点银子了 class ...

  7. MinGW-W64下载与安装

    安装方案 1 下载安装包,MinGW-w64 - for 32 and 64 bit Windows,然后直接以管理员安装即可,但是这个方案在部分电脑可能不行,会提示 cannot download ...

  8. iOS - 创建可以在 InterfaceBuilder 中实时预览的自定义控件

    一.需求实现一个前后带图标的输入框 这是一个简单的自定义控件,很容易想到自定义一个视图(UIView),然后前后的图标使用 UIImageView 或者 UIButton 显示,中间放一个 UITex ...

  9. SqlServer数据库知识点笔记

    1.主键约束: 要对一个列加主键约束的话,这列就必须要满足的条件就是非空 因为主键约束:就是对一个列进行了约束,约束为(非空.不重复) 以下是代码   要对一个列加主键,列名为id,表名为emp 格式 ...

  10. ABA问题怎么解:AtomicStampedReference和AtomicMarkableReference

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 并发编程的基石--CAS机制这篇文章中介绍到CAS机制有 ...