为什么我的超类调用我的子类方法?

时间:2018-03-14 02:07:23

标签: python inheritance override subclass superclass

当我调用一个被我的构造函数覆盖的方法时,我收到一个错误,它说它缺少一个参数(由于子类需要第二个参数)。但是,我在super()中调用了该方法,为什么不调用该方法的超类版本呢?

最好用一个简短的例子说明:

class A:
    def __init__(self):
        self.do()

    def do(self):
        print("A")


class B(A):
    def __init__(self):
        super().__init__()
        self.do("B")

    def do(self, arg2):
        super().do()
        print(arg2)


b = B()

这是我得到的错误:

Traceback (most recent call last):
    File "D:/Python/Advanced/randomStuff/supersub.py", line 19, in <module>
        b = B()
    File "D:/Python/Advanced/randomStuff/supersub.py", line 11, in __init__
        super().__init__()
    File "D:/Python/Advanced/randomStuff/supersub.py", line 3, in __init__
        self.do()
TypeError: do() missing 1 required positional argument: 'arg2'

它似乎是在类B中调用do()方法,但我想在类A中调用do()方法。 理想情况下,代码应该打印:

A
A
B

我做错了什么?

2 个答案:

答案 0 :(得分:1)

答案是,调用自身定义但也被子类重写的方法的基类调用子类上的重写方法而不是基类上的方法。有关详细信息,请参阅calling an overridden method from base class?。请参阅以下代码变体,并按照上述逻辑进行操作。

ListTask

结果: 一个 乙 一个 乙

答案 1 :(得分:0)

这真的很好奇。我没有解决方案,但下面似乎按预期工作。它完全相同,只是使用self。 class 作为参数显式调用super(),我认为这是隐含的。

也许更熟练的Pythonista可以建立在这种观察上。

class A:
    def __init__(self):
        self.do()

    def do(self):
        print("A")

class B(A):
    def __init__(self):
        super(self.__class__).__init__()
        self.do("B")

    def do(self, arg2):
        super().do()
        print(arg2)

print('***init A***')
a = A()
print('***init B***')
b = B()
print('***A.do()***')
a.do()
print('***B.do()***')
b.do('test')