考虑以下类,运行python2.7:
class S(object):
def __init__(self):
print 'Si'
self.reset()
def reset(self):
print 'Sr'
self.a=0
class U1(S):
def reset(self):
print 'U1r'
self.b=0
super(S,self).reset()
所需的功能是
我得到(1):
>>> print S().a
Si
Sr
0
但不是(2):
>>> print U1().b
Si
U1r
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tt.py", line 4, in __init__
self.reset()
File "tt.py", line 14, in reset
super(S,self).reset()
AttributeError: 'super' object has no attribute 'reset'
什么是获得我想要的最干净的方式?我认为错误与类成员资格构建的顺序有关,但我无法从文档中弄清楚。 。
答案 0 :(得分:2)
您应该在super(U1, self).reset()
中致电U1.reset()
。使用super
时,应始终将当前类的名称作为第一个参数传递,而不是父类的名称。 As stated in the docs:
<强>
super(type[, object-or-type])
强>返回一个代理对象,该方法将方法调用委托给
type
的父类或兄弟类
super
将在您提供的type
的父级或兄弟级别上查找该方法。当您提供父类时,它将尝试在父项的父项/兄弟项上查找reset
的实现,这将失败。
答案 1 :(得分:1)
应该是:
super(U1, self).reset()
在我脑海中,我读了超级(U1,...&#34;作为&#34; U1和#34的父母;为了保持原状。