假设我有3个类:A,B和C.A是B的基类,B是C语言。层次结构在这里保持正常,但对于一种方法,它应该是不同的。对于C类,它应该像从A继承。
例如:
class A(object):
def m(self):
print 'a'
class B(A):
def m(self):
super(B, self).m()
print 'b'
class C(B):
def m(self):
super(A, self).m()
print 'c'
所以基本上它应该像这样工作:
a = A()
a.m()
a
b = B()
b.m()
a
b
c = C()
c.m()
a
c
但它对C类不起作用,因为我收到了这个错误:
AttributeError: 'super' object has no attribute 'm'
要为C类解决这个问题,我可以从A类继承,但我想继承B中的所有内容,并且对于基类A,该特定方法m
调用super。我的意思是该方法是一个例外。或者,为了工作,我应该以不同的方式为C类调用它吗?
我该怎么做?
答案 0 :(得分:8)
实际上有两种方法可以解决这个问题:您可以快速调用super()
并完全绕过mro,就像Mathias Ettinger的回答一样,或者你可以发出正确< / em>致电super()
:
class C(B):
def m(self):
super(B, self).m()
print 'c'
请记住,super()
期望从第一个参数开始查找mro的类。它通常是进行调用的类,但如果需要,可以在mro中传递另一个类。
答案 1 :(得分:4)
使用super
调用,python将检查类的MRO以确定在调用所需函数时使用的类。
由于您希望将此行为短路,您可以使用以下方法明确说明要使用该方法的类:
class C(B):
def m(self):
A.m(self)
print 'c'