即使使用了super(),__init __()方法也会被覆盖。为什么?

时间:2019-06-03 20:23:26

标签: python inheritance super

与标题中一样,我在继承类__init__中启动了超类__init__方法,但仍然被覆盖,或者至少我认为是这样。我希望self.x = x也能在继承类中工作。

class Abs(ABC):
    def __init__(self, x: int = 1, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        self.x = x

    @abstractmethod
    def foo(self):
        pass

class Con(Abs):
    def __init__(self, x: int = 1, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)

    def foo(self):
        print(self.x)

obj = Con(x=4)
obj.foo() # <---- this here returns 1 instead of 4

1 个答案:

答案 0 :(得分:2)

这是因为您没有在超级通话中传递x。应该是:

def __init__(self, x: int = 1, *args, **kwargs) -> None:
    super().__init__(x, *args, **kwargs)

但是,请注意,此方法完全没有意义。如果要执行与超类版本不同的操作,则仅应覆盖方法。在这种情况下,您不会;您应该从Con中完全删除该方法。