簡體   English   中英

調用 super().method() 與 BaseClass.method(self)

[英]Calling super().method() vs. BaseClass.method(self)

派生的 class 有兩種主要方式來調用基類的方法。

Base.method(self):

class Derived(Base):
    def method(self):
        Base.method(self)
        ...

super().method():

class Derived(Base):
    def method(self):
        super().method()
        ...

假設我現在這樣做:

obj = Derived()
obj.method()

據我所知, Base.method(self)super().method()都做同樣的事情。 兩者都將調用Base.method並引用obj 特別是, super()不會做任何工作來實例化Base類型的 object 。 相反,它會創建一個super類型的新 object 並將實例屬性從obj移植到它上面,然后當您嘗試從 super object 獲取它時,它會動態地從Base中查找正確的屬性。

當您更改派生 class 的基數時, super()方法的優點是可以最大限度地減少您需要做的工作。 另一方面,當 class 從多個基類繼承時, Base.method使用較少的魔法並且可能更簡單、更清晰。

我見過的大多數討論都建議調用super() ,但這是 Python 編碼器中的既定標准嗎? 還是這兩種方法都在實踐中廣泛使用? 例如, 這個 stackoverflow 問題go 兩種方式的答案,但通常使用super()方法。 另一方面,我本學期教的Python 教科書只顯示了Base.method方法。

使用super()意味着下面的任何內容都應該委托給基礎 class,無論它是什么。 這是關於語句的語義。 另一方面,明確引用Base傳達了Base是出於某種原因(讀者可能不知道)被明確選擇的想法,這也可能有其應用。

除此之外,使用super()有一個非常實際的原因,即協作多個 inheritance 假設您設計了以下 class 層次結構:

class Base:
    def test(self):
        print('Base.test')

class Foo(Base):
    def test(self):
        print('Foo.test')
        Base.test(self)

class Bar(Base):
    def test(self):
        print('Bar.test')
        Base.test(self)

現在您可以同時使用FooBar並且一切都按預期工作。 但是,這兩個類不能在多個 inheritance 模式中一起工作:

class Test(Foo, Bar):
    pass

Test().test()
# Output:
# Foo.test
# Base.test

最后一次調用test跳過了Bar的實現,因為Foo沒有指定它想按方法解析順序委托給下一個 class ,而是明確指定Base 使用super()解決了這個問題:

class Base:
    def test(self):
        print('Base.test')

class Foo(Base):
    def test(self):
        print('Foo.test')
        super().test()

class Bar(Base):
    def test(self):
        print('Bar.test')
        super().test()

class Test(Foo, Bar):
    pass

Test().test()
# Output:
# Foo.test
# Bar.test
# Base.test

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM