乙個子類繼承多個父類,就是多繼承,並且擁有所有父類的屬性和方法
例如:孩子會繼承父親和母親的特徵
如果子類和父類中有相同的方法,就會呼叫子類中的方法
如果不同的父類中存在有相同的方法名稱,子類物件呼叫的時候會呼叫哪個父類中的方法呢?
python 會根據mro(method resolution order) 方法解析順序列表進行查詢。
classdog:
defeat(self):
print("
吃骨頭"
)class
god:
defeat(self):
print("
吃上帝"
)class
thing(god,dog):
pass
thing =thing()
thing.eat()
print(thing.__mro__)#
吃上帝#
(, , , )
mro列表並遵循如下三條準則:1.子類會先於父類被檢查
2.多個父類會根據他們在列表中的順序進行檢查
3.如果對下乙個類中有兩個合法的選擇,選擇第乙個父類
classa:
deffunc(self):
print("
----a----")
class
b(a):
deffunc(self):
print("
----b----")
class
c(a):
deffunc(self):
print("
----b-----")
class
d(b,c):
pass
d =d()
d.func()
print(d.__mro__
(d.mro())
#----b----
#(, , , , )
#[, , , , ]
多繼承中super本質不是直接查詢父類,而是根據呼叫節點的廣度優先順序執行的
練習:建立 a、b、c、d 類,d 類繼承 b,c 類,b 類繼承 a 類,c 類繼承 a 類。
在每個方法中都呼叫 super().func()方法,檢視執行順序。
classa:
deffunc(self):
print("
----a----")
class
b(a):
deffunc(self):
super(b, self).func()
print("
----b----")
class
c(a):
deffunc(self):
super(c, self).func()
print("
----c-----")
class
d(b,c):
deffunc(self):
super(d, self).func()
print("
----d-----")
d =d()
d.func()
#繼承順序 d-->b-->c-->a
#結果:a,c,b,d
print(d.__mro__
(d.mro())
#(, , , , )
#[, , , , ]
classa:
deffunc(self):
print("
----a----")
class
b(a):
deffunc(self):
super(b, self).func()
print("
----b----")
class
c(a):
deffunc(self):
super(c, self).func()
print("
----c-----")
class
d(b):
deffunc(self):
super(d, self).func()
print("
----d-----")
class
e(c):
deffunc(self):
super(e, self).func()
print("
----e-----")
class
f(d, e):
deffunc(self):
super(f, self).func()
print("
----f-----")
f =f()
f.func()
#繼承順序 d-->b-->c-->a
#----a----
#----c-----
#----e-----
#----b----
#----d-----
#----f-----
classa:
deffunc(self):
print("
----a----")
class
b(a):
deffunc(self):
super(b, self).func()
print("
----b----")
class
c(a):
deffunc(self):
super(c, self).func()
print("
----c-----")
class
d(c):
deffunc(self):
super(d, self).func()
print("
----d-----")
class
e(b):
deffunc(self):
super(e, self).func()
print("
----e-----")
class
g(b):
deffunc(self):
super(g, self).func()
print("
----g-----")
class
h(a):
deffunc(self):
super(h, self).func()
print("
----h-----")
class
f(d, e,g,h):
deffunc(self):
super(f, self).func()
print("
----f-----")
f =f()
f.func()
#----a----
#----h-----
#----b----
#----g-----
#----e-----
#----c-----
#----d-----
#----f-----
class a1: passclass a2: pass
class a3: pass
class b1(a1,a2): pass
class b2(a2): pass
class b3(a2,a3): pass
class c1(b1): pass
class c2(b1,b2): pass
class c3(b2,b3): pass
class d(c1, c2, c3): pass
print("
從d開始查詢:")
for s in d.__mro__
:
(s)
#從d開始查詢:##
####
####
#
物件導向三大特性: 封裝、繼承、多型1.封裝:遮蔽提供細節,但提供呼叫方式,將功能封裝成乙個整體,提供簡單的呼叫方式
2.繼承:可以擁有另乙個類的方法和屬性
3.多型:讓某個類呈現多種形態
實現多型的三個條件: 1.必須存在繼承關係 2.重寫目標方法 3.使用子類物件呼叫父類方法
定義人類,可以跳舞,可以玩,在玩的過程跳舞
實現多型,老年人跳廣場舞
classperson:
defdance(self):
print('跳舞'
)
defplay(self):
self.dance()
#old.dance()
class
oldman(person):
defdance(self):
print("
跳廣場舞")
old =oldman()
old.play()
per =person()
per.play()
Python3 x基礎學習 property
1 property 內建裝飾器函式,把乙個方法呼叫方式變成屬性呼叫方式。將乙個方法當成乙個屬性使用 注意 property裝飾器只能在物件導向中使用 2 訪問使用 property 裝飾器裝飾函式可以直接呼叫函式名 會執行一段功能 函式 然後返回值 3.property裝飾器只能修飾不帶引數的方法...
Python3 x基礎學習 裝飾器
1.裝飾器函式的本質 乙個閉包函式 2.裝飾器函式的作用 在不修改原函式及其呼叫方式的情況下對原函功能進行擴充套件 3.語法格式 裝飾器名稱 def foo print foo foo 公司有n個部門,每個部門負責相應的業務 deff1 print 身份驗證 print f1 def f2 prin...
Python3 x基礎學習 os模組學習
使用os 模組對檔案進行一些相關操作 importos 1.重新命名檔案 os.rename 舊檔名,新檔名 os.rename test.txt test3.txt os.rename test4.txt test 2.刪除檔案 os.remove 檔名 os.remove test1.py 3....