python 多重繼承的方法解析順序

2021-09-03 01:38:13 字數 1982 閱讀 7939

任何實現多重繼承的語言都要處理潛在的命名衝突, 這種衝突由不相關的祖先類實現同名方法引起

這裡b和c都實現了eat方法,

在 d 的例項上呼叫 d.eat() 方法的話, 執行的是哪個 eat 方法呢?

>>> d = d()

>>> d.eat()

b eating: <__main__.d object at>

0x7fb90c627f60>

>>> c.eat(d)

c eating: <__main__.d object at>

0x7fb90c627f60>

超類中的方法都可以直接呼叫, 此時要把例項作為顯式引數傳入

python 能區分 d.eat() 呼叫的是哪個方法, 是因為 python 會按照特定的順序遍歷繼承圖。 這個順序叫方法解析順序( method resolution order, mro)。 類都有乙個名為 __mro__ 的屬性, 它的值是乙個元組, 按照方法解析順序列出各個超類, 從當前類一直向上, 直到object 類。 d 類的 __mro__ 屬性如下 :

>>> 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...