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