Python 如何在重写方法时调用该方法

Python 如何在重写方法时调用该方法,python,methods,overriding,pycharm,abstract,Python,Methods,Overriding,Pycharm,Abstract,我有以下类层次结构: class AbstractClass(object): __metaclass__ = ABCMeta @abstractmethod def foo(self): pass class A(AbstractClass): def __init__(): super().__init__() def foo(self):

我有以下类层次结构:

    class AbstractClass(object):
        __metaclass__ = ABCMeta

        @abstractmethod
        def foo(self):
            pass

    class A(AbstractClass):
        def __init__():
            super().__init__()

        def foo(self):
            //Logic

    class B(A):
        def __init__():
            super().__init__()
我想使用foo,因为它是在A中实现的,所以我不能在B中重写它。 使用B.foo()是可行的,但我仍然收到PyCharm的警告:

“类B必须实现所有抽象方法”


我必须重写已经重写抽象方法的方法吗?如何在不丢失实现的情况下覆盖它?把这个方法复制到子类中?

我正要问这个问题,突然想到它是如何工作的。我想“我怎么能在重写一个方法之后调用它呢?” 经过一番思考,我终于明白了

在子类中重写时,从超类调用重写的方法:

class B(A):
    def __init__():
        super().__init__()

    def foo(self):
        super().foo()
这是因为超类型方法必须在不提供进一步实现的情况下使用其子类型。在我弄明白之后,它看起来很合乎逻辑


这对于那些刚刚了解继承是如何工作的人来说可能很有用。

我不确定您的最终目标是什么,但可以使用super调用在超类中定义的目标。当您通过
self
引用一个名称时,如果该名称不在对象的名称空间中,Python会查看超类的名称空间,因此,如果您不需要重写
foo
,具体地说,在B中,只需使用
self.foo()
调用
a
中定义的名称。我看到您使用Python 3了吗?