一、經典類與新式類(了解)
新式類:
1)凡是繼承object的類或子孫類都是新式類
2)在python3中所有的類都是新式類(默認繼承object)
經典類:
1)必須在python2中才會有經典類與新式類之分
2)在python2中,凡是沒有繼承object的類,都是經典類
# 新式類:
class User(object):
pass
class 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 = 10
class Father2:
x = 20
class 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
經典式深度優先不做展示,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190082.html
標籤:Python
上一篇:Java 內部類詳解
