首頁 > 軟體

python中關於對super()函數疑問解惑

2022-08-11 14:02:08

案例一:執行下面的程式碼結果是什麼?

class Person:
    def run(self):
        print('studying')

class Person1:
    def run(self):
        print('working')

class Person2:
    def run(self):
        print('playing')

class Person3(Person,Person1,Person2):

    def run(self):
        super().run1()

p=Person3()
p.run()

執行結果:

AttributeError: ‘super’ object has no attribute ‘run1’

注意:

1、一個類繼承多個類時,如果父類別中沒有提供該方法,類會通過__mro__屬性一直向上搜尋,如果直到object還沒有搜尋到該方法,那麼將會引發AttributeError異常

案例二:執行下面的程式碼結果是什麼?

class Person:
    def run(self):
        print('studying')

class Person1:
    def run(self):
        print('working')

class Person2:
    def run(self):
        print('playing')

class Person3(Person,Person1,Person2):

    def run(self):
        super(Person1,self).run()

p=Person3()
p.run()

輸出結果為:playing;而不是working

注意:

1、super()函數的使用。
使用super()函數時,可以通過super(類名,self)來指定對哪個物件以哪個類為起點向上搜尋父類別中的方法。
例如:super(Person1,self).run():表示以Person1類為起點,向上搜尋self(Person3的物件)的run方法。
Person1向上搜尋到了<class ‘main.Person2’>,所以才會輸出playing

2、print(Person3.mro)的繼承順序為:(<class ‘main.Person3’>, <class ‘main.Person’>, <class ‘main.Person1’>, <class ‘main.Person2’>, <class ‘object’>)

案例三、更復雜些的繼承,和上面的同理

class A:
    def who(self):
        print('A', end='')

class B(A):
    def who(self):
        super(B, self).who()
        print('B', end='')

class C(A):
    def who(self):
        super(C, self).who()
        print('C', end='')

class D(B, C):
    def who(self):
        super(D, self).who()
        print('D', end='')

item = D()
item.who()


print(D.__mro__)

輸出結果:

ACBD
(<class ‘main.D’>, <class ‘main.B’>, <class ‘main.C’>, <class ‘main.A’>, <class ‘object’>)

總結

到此這篇關於python中關於對super()函數疑問解惑的文章就介紹到這了,更多相關python super()函數解惑內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com