[英]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.