任何實現多重繼承的語言都要處理潛在的命名衝突, 這種衝突由不相關的祖先類實現同名方法引起
class a:
def say(self):
print("a hello:", self)
class b(
def eat(self):
print("b eating:", self)
class c(a):
def eat(self):
print("c eating:", self)
class d(b, c):
def say(self):
super().say()
print("d hello:", self)
def dinner(self):
self.say()
super().say()
self.eat()
super().eat()
c.eat(self)
這裡b和c都實現了eat方法,
在 d 的例項上呼叫 d.eat() 方法的話, 執行的是哪個 eat 方法呢?
>>> d = d()
>>> d.eat()
b eating: <__main__.d object at>
>>> c.eat(d)
c eating: <__main__.d object at>
超類中的方法都可以直接呼叫, 此時要把例項作為顯式引數傳入
python 能區分 d.eat() 呼叫的是哪個方法, 是因為 python 會按照特定的順序遍歷繼承圖。 這個順序叫方法解析順序( method resolution order, mro)。 類都有乙個名為 __mro__ 的屬性, 它的值是ehvdkrnx乙個元組, 按照方法解析順序列出各個超類, 從當前類一直向上, 直到object 類。 d 類的 __mro__ 屬性如下 :
>>> d.__mro__
(, , , )
>>>ehvdkrnx; d = d()
>>> d.dinner()
a hello: <__main__.d object at>
d hello程式設計客棧: <__main__.d object at>
a hello: <__main__.d object at>
b eating: <__main__.d object at>
b eating: <__main__.d object at>
c eating: <__main__.d object at>
第乙個self.say(),執行a類的say()再print出自己的第二行資訊
第二個super().say(),執行a類的say()
第三個self.eat(),根據__mro__, 找到的是 b 類實現的eat方法
第四個super().eat(),根據__mro__, 找到的是 b 類實現的eat方法
第五個c.eat(self)忽略 mro , 找到的是 c 類實現的eat方法
python 多重繼承的方法解析順序
任何實現多重繼承的語言都要處理潛在的命名衝突,這種衝突由不相關的祖先類實現同名方法引起 這裡b和c都實現了eat方法,在 d 的例項上呼叫 d.eat 方法的話,執行的是哪個 eat 方法呢?d d d.eat b eating main d object at 0x7fb90c627f60 c.e...
python的多重繼承
在設計類的繼承關係時,通常,主線都是單一繼承下來的,如果需要 混入 額外的功能,通過多重繼承就可以實現,這種設計通常稱之為mixin。class animal object pass class mammal animal pass class runnable object def run sel...
python的多重繼承
python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現 經典類 usr bin pyth...