[英]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)
現在您可以同時使用Foo
和Bar
並且一切都按預期工作。 但是,這兩個類不能在多個 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.