Python面向对象之继承
前言:
继承是面向对象的3大特性之一,对于继承一点要注意一下4点。
一、基本查找
如果子类继承了父类,子类的实例化对象,没有的方法和属性会去父类找
class Parent(object): #父类
def f1(self):
print('f1') class Sub(Parent): #子类
pass obj=Sub() #如果子类继承了父类,子类的实例化对象,没有的方法和属性会去父类BAR()
obj.f1()
二、多继承查找顺序
python中的类支持继承多个类,在Java和C#中则不会存在;
如果Python中的类如果继承了多个类,其寻找方式无非2种,分别是深度优先,广度优先;
pyton2如果没有继承object默认使用的是经典类:所有经典类使用深度优先的算法查找顺序
Python3默认使用新式类:所有经典类使用广度优先的查询顺序:1次查找留头,在去第二条支路上找到头;
1、python3新式类继承顺序:
a、2条支路通往1个头 python3中的类属于新式类,首次查找规则是广度优先(从左往右找)
MRO图:

继承顺序:
新式类:F-->D--->B(不会找到头留1个,去右边找E) | E--->C--->A--->object
经典类:F-->D-->B-->A--->E--->C
代码:
#新式类的继承,在查找属性时遵循广度优先
class A(object):
def test(self):
print('from A') class B(A):
# def test(self):
# print('from B')
pass class C(A):
def test(self):
print('from C')
pass class D(B):
# def test(self):
# print('from D')
pass class E(C):
def test(self):
print('from E') class F(D,E): #注意多继承一定要遵循 MRO图顺序,不能先继承父类,还继承父类的子类 例:class F(A,B/C/D/E)都会报错
# def test(self):
# print('from F')
pass f1=F()
f1.test()
# F-->D--->B(不会找到头)留1个)--->E--->C--->A--->object 广度优先
b、如果3条支路通往1个头
MRO图:

继承顺序:
新式类:H-->E--->B-->F-->C-->G-->D-->A
经典类:H-->E-->B-->A-->F-->C-->G--D
代码:
class A(object):
def test(self):
print('from A')
pass class B(A):
# def test(self):
# print('from B')
pass class C(A):
# def test(self):
# print('from C')
pass class D(A):
# def test(self):
# print('from D')
pass class E(B):
# def test(self):
# print('from E')
pass class F(C):
# def test(self):
# print('from F')
pass class G(D):
# def test(self):
# print('from G')
pass class H(E,F,G):
# def test(self):
# print('from H')
pass h1=H()
h1.test()
c、如果有2条之路就意味着有2个源头,支路1到头,支路2到头
MRO图:

继承顺序:
新式类: F-->D--->B-->X(走到头) | E--->C--->C--->Y--->object(走到头)
经典类: F-->D--->B-->X(走到头) | E--->C--->C--->Y--->object(走到头)
代码:
class X(object):
def test(self):
print('from X')
pass class Y(object):
def test(self):
print('from Y')
pass class B(X):
# def test(self):
# print('from B')
pass
class C(Y):
def test(self):
print('from C')
pass
class D(B):
# def test(self):
# print('from D')
pass
class E(C):
def test(self):
print('from D')
pass class F(D,E):
# def test(self):
# print('from F')
pass f1=F()
f1.test()
三、继承关系混乱不遵循CRO
注意多继承一定要遵循 MRO图顺序,不能先继承父类,还继承父类的子类 例:class F(A,B/C/D/E)都会报错
四、self是到底谁?
为什么B类中没有f2方法却可以执行呢,一定要明白self对象是谁的实例?
obj对象没有f1方法,就去self对象对应的类开始找
obj对象没有f2方法,也去self对象对应的类开始找
class A(object):
def f2(self):
print('A.f2') class B(object):
def f1(self):
print('B.f1')
self.f2() #为什么B类中没有f2方法却可以执行呢,一定要明白self对象是谁的实例?
#obj对象没有f1方法,就去self对象对应的类开始找
#obj对象没有f2方法,也去self对象对应的类开始找
class C(A):
def f1(self):
print('C.f1') class D(B):
def f2(self):
print('D.f1') class Foo(A,D):
pass obj=Foo()
obj.f1() #执行结果
# B.f1
# A.f2
Python面向对象之继承的更多相关文章
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
- Python面向对象03 /继承
Python面向对象03 /继承 目录 Python面向对象03 /继承 1. 初识继承 2. 单继承 3. 多继承 4. 总结 1. 初识继承 概念:专业角度:如果B类继承A类,B类就称为子类,派生 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- python面向对象编程 继承 组合 接口和抽象类
1.类是用来描述某一类的事物,类的对象就是这一类事物中的一个个体.是事物就要有属性,属性分为 1:数据属性:就是变量 2:函数属性:就是函数,在面向对象里通常称为方法 注意:类和对象均用点来访问自己的 ...
- python面向对象的继承-组合-02
*面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...
- python 面向对象之继承与派生
一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...
- python面向对象之继承/多态/封装
老师说,按继承/多态/封装这个顺序来讲. 子类使用父类的方法: #!/usr/bin/env python # coding:utf-8 class Vehicle: def __init__(sel ...
- python面向对象之继承与派生
一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...
- 十七、Python面向对象之继承
在面向对象,继承是一个很重要的特性 子类与父类,子类是对父类的一种扩展,在父类的属性和方法上进行一些扩展 示例:没带继承 #定义一个带编号和状态的门的类 class Door(object): d ...
随机推荐
- 函数指针-如何理解typedef void (*pfun)(void)
问题: 在刚接触typedef void (*pfun)(void) 这个结构的时候,存在疑惑,为什么typedef后只有一"块"东西,而不是两"块"东西呢?那 ...
- 小程序之map地图上不能在覆盖层
问题:页面上有一个地图功能,地图上面有两个按钮,是需要覆盖在地图上的,在小程序编辑器中显示是没问题的,但是扫码测试后发现在手机上不显示这两个按钮 解决方法:使用cover-viwe标签包裹一下就可以了
- 使用MVCPager做AJAX分页所需要注意的地方
1.版本问题,推荐使用2.0以上,对ajax支持才比较的好了 2.当需要使用页索引输入或下拉框以及使用Ajax分页模式时,必须用Html.RegisterMvcPagerScriptResource方 ...
- _itemmod_day_limit
控制玩家每天获得的物品上限 表说明 `comment` 备注 `entry` 物品 `limitCount`获取上限
- 【BZOJ】3143: [Hnoi2013]游走
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 显然如果一条边期望被走过的次数越多,我们就应该给它的编号越小. 所以问题变为如何求每 ...
- 【BZOJ】3209: 花神的数论题
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3209 显然是按照二进制位进行DP. 考虑预处理$F[i][j]$表示到了二进制的第$i$位 ...
- codeforces gym 100947 J. Killing everything dp+二分
J. Killing everything time limit per test 4 seconds memory limit per test 64 megabytes input standar ...
- JaveWeb 公司项目(1)----- 使Div覆盖另一个Div完成切换效果
最近在做网页,用的是CSS+DIV的布局方法,搭建了一个简易的界面,大体上分为三个部分,如图所示: 左侧的为主功能导航栏,右侧是具体的功能实现,下方是固定的版权声明,单击左边不同的导航按钮,在div中 ...
- mime模块响应或设置Node.js的Content-Type头
转载自:https://itbilu.com/nodejs/core/VJYaAfKrl.html MIME,即:Multipurpose Internet Mail Extensions,多用途 ...
- linux中日历命令显示
cal 显示当前月的日历 cal 年份 显示特定一年的年历 [jasmine.qian@]$ cal January 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 ...