经典类与新式类、钻石继承(菱形继承)、多继承之“广度优先”“深度优先”
一、经典类与新式类(了解)
新式类:
1)凡是继承object的类或子孙类都是新式类
2)在python3中所有的类都是新式类(默认继承object)
经典类:
1)必须在python2中才会有经典类与新式类之分
2)在python2中,凡是没有继承object的类,都是经典类
# 新式类:class User(object):
passclass Sub(User):
pass
# 在python3中所有的类都是新式类(默认继承object)
class Bar:
pass
print(Bar.__bases__) # (<class "object">,)
二、新式类查找属性和方法的顺序(了解)
在python3中提供了一个新式类查找属性和方法的顺序的内置方法:
mro():会把当前类的继承关系列出来
调用mro返回的是一个继承序列:
super()的继承序列严格遵循mro继承序列
新式类查找属性和方法的顺序:
1)先从子类中查找
2)若子类中没有,从父类中查找,如果继承多个父类的情况下:从左到右
3)若父类中也没有,从object中查找
4)若object中也没有则报错
class Father1:x
= 10class Father2:
x
= 20class Father3:
x = 30
# 多继承的情况下:从左到右
class Sub(Father1, Father2, Father3):
# 注意:__int__ 不是 __init__
def__init__(self):
print(super().x)
obj = Sub()
print(Sub.mro())
# 子类和父类中都没有这个方法,但是object中有,所以从object中找到.__dir__
print(Sub.__dir__)
执行结果:
10[
<class"__main__.Sub">, <class"__main__.Father1">, <class"__main__.Father2">, <class"__main__.Father3">, <class"object">]<method "__dir__" of "object" objects>
三、钻石继承(菱形继承)
继承多个父类的情况下会造成"钻石继承"
例:多继承
class A(object):def test(self):print("from A")class B(A):def test(self):print("from B")class C(A):def test(self):print("from C")class D(B):def test(self):print("from D")class E(C):def test(self):print("from E")class F(D, E):def test(self):print("from F")print(F.mro())
执行结果:
[<class"__main__.F">, <class"__main__.D">, <class"__main__.B">, <class"__main__.E">, <class"__main__.C">, <class"__main__.A">, <class"object">]
继承结果图:
因为整体形状像钻石或者像菱形,所以叫做钻石继承,也叫做菱形继承。(类似的形状也可以,前提是多继承)
四、类继承之广度优先、深度优先
python 支持多继承,但对与经典类和新式类来说,多继承查找的顺序是不一样的。
内置方法mro()的查找顺序:
- 新式类
从左到右,广度优先
- 经典类
从左到右,深度优先
两种概念图:
新式类广度优先演示:
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")
class D(B):
# def test(self):
# print("from D")
pass
class E(C):
def test(self):
print("from E")
class F(D, E):
# def test(self):
# print("from F")
pass
obj = F()
print(obj.test())
执行结果:
from E
经典式深度优先不做展示。
以上是 经典类与新式类、钻石继承(菱形继承)、多继承之“广度优先”“深度优先” 的全部内容, 来源链接: utcz.com/z/531171.html