Python从一个类继承但是覆盖方法调用另一个类?

时间:2015-09-22 11:18:51

标签: python oop inheritance super

假设我有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类调用它吗?

我该怎么做?

2 个答案:

答案 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'