[英]Calling super() without a base class
我正在閱讀 O Reilly Python Cookbook,並且一直在努力使用以下代碼。 這是使用super()
在父類上調用方法:
class Proxy:
def __init__(self, obj):
self._obj = obj
# Delegate attribute lookup to internal obj
def __getattr__(self, name):
return getattr(self._obj, name)
# Delegate attribute assignment
def __setattr__(self, name, value):
if name.startswith('_'):
super().__setattr__(name, value) # Call original __setattr__
else:
setattr(self._obj, name, value)
if __name__ == '__main__':
class A:
def __init__(self, x):
self.x = x
def spam(self):
print('A.spam')
a = A(42)
p = Proxy(a)
print(p.x)
print(p.spam())
p.x = 37
print('Should be 37:', p.x)
print('Should be 37:', a.x)
書中指出:
在此代碼中,
__setatrr__()
的實現包括名稱檢查。 如果名稱以下划線開頭,它將使用super()
調用__setattr__()
的原始實現。 否則,它委托給內部持有的對象self._obj
。
我很迷惑。 如果沒有列出明確的基類,那么super()
如何工作? 那么super()
究竟指的是什么?
總有一個基類; 沒有明確提及, Proxy
直接從object
繼承。
每個類定義一個方法解析順序,由其基類及其祖先遞歸確定。 當super()
被調用時,它會解析為self
的 MRO 中下一個類的“代理”,無論該類是否出現在您當前定義的類的 MRO 中。
考慮以下類:
class A:
def foo(self):
print("A.foo")
class B(A):
def foo(self):
super().foo()
print("B.foo")
class C(A):
def foo(self):
super().foo()
print("C.foo")
class D(C):
def foo(self):
super().foo()
print("D.foo")
class E(B,D):
def foo(self):
super().foo()
print("E.foo")
e = E()
E
的 MRO 是[E, B, D, C, A, object]
。 當您調用e.foo()
,您e.foo()
MRO 順序啟動一系列調用。 特別是,在B.foo
中對super
的調用不會調用A.foo
,而是D.foo
,類B
一個方法一無所知,因為D
不是B
的祖先。 但是B
和D
都是E
祖先,這很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.