子類直接呼叫超類 __init__ 方法初始化,當形成鑽石繼承的時候,超類會被多次初始化,可能會有意向不到的問題:
baseclass
oneclass twoclass
testclass
from pprint importpprint
class
baseclass(object):
def__init__
(self, a):
#value = a
self.value =a
class
oneclass(baseclass):
def__init__
(self, a):
baseclass.
__init__
(self, a)
#value + 2
self.value += 2
class
twoclass(baseclass):
def__init__
(self, a):
baseclass.
__init__
(self, a)
#value * 2
self.value *= 2
class
testclass(twoclass, oneclass):
def__init__
(self, a):
twoclass.
__init__
(self, a)
oneclass.
__init__
(self, a)
#value + 8
self.value += 8
self.value
pprint(testclass.mro())
test = testclass(3) #13#
初始化的過程是:baseclass ——> twoclass ——> baseclass ——> oneclass ——> testclass
#value 的變化: value = 3 ——> value = 6 ——> value = 3 ——> value = 5 ——> value = 13
使用 super 可以解決超類重複初始化的問題,保證超類只被初始化一次:
from pprint importpprint
class
baseclass(object):
def__init__
(self, a):
#value = a
self.value =a
class
oneclass(baseclass):
def__init__
(self, a):
super(oneclass, self).
__init__
(a)
#value + 2
self.value += 2
class
twoclass(baseclass):
def__init__
(self, a):
super(twoclass, self).
__init__
(a)
#value * 2
self.value *= 2
class
testclass(twoclass, oneclass):
def__init__
(self, a):
super(testclass, self).
__init__
(a)
#value + 8
self.value += 8
self.value
pprint(testclass.mro())
"""以以下相反的順序初始化子類
[, ,
, ,]"""
test = testclass(3) #18#
初始化的過程是:baseclass ——> oneclass ——> twoclass ——> testclass
#value 的變化: value = 3 ——> value = 5 ——> value = 10 ——> value = 18
python基礎 多重繼承
繼承多個父類時,子類中使用哪個父類的屬性,跟class語句中這些父類的順序有關係,以前面的父類的屬性為準 在python中使用mro 方法解析順序 這種演算法來查詢多重繼承下使用哪個父類的屬性 class b num 78 class c num 70 class a b,c pass print ...
Python基礎 MixIn設計 多重繼承
如果需要 混入 額外的功能,通過多重繼承就可以實現 示例 usr bin env python3 coding utf 8 多重繼承 飛class fly object deffly print fly 游泳 class swin object defswin print swin 超人 多重繼承 ...
python 多重繼承
python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現 經典類 usr bin pyth...