Python中,是否有一种方法可以从父类调用子类的方法覆盖?

3

我正在尝试重新学习 Python,并弄清楚关于抽象类和多态的具体细节、技巧和常见约定。目前,我的类层次结构如下:

from abc import ABC, abstractmethod


class A(ABC):

    @abstractmethod
    def x(self):
        pass

    def do_x_ten_times(self):
        for i in range(10):
            x()


class B(A):

    def x(self):
        print("Hello World")


class C(A):

    def x(self):
        print("Hello StackOverflow")



b = B()
b.x()

c = C()
c.x()

b.do_x_ten_times()

我认为do_x_ten_times()在子类BC中的代码完全相同。因此,如果我可以将do_x_ten_times()的代码放在A中,并让A调用子类的x()实现,那将非常方便(我的代码也会更少重复)。不幸的是,我收到了“NameError: name 'x' is not defined.”的错误提示。
我明白这样做可能不太典型,我的直觉告诉我它可能违反了多态的某些规则。如果真的需要,我可以将do_x_ten_times()复制到BC类中,并在A中使其成为抽象方法。但我想知道是否有任何合理的方法可以避免重复这段代码。
1个回答

3

A.do_x_ten_times()中,需要调用self.x()

from abc import ABC, abstractmethod


class A(ABC):

    @abstractmethod
    def x(self):
        raise NotImplementedError

    def do_x_ten_times(self):
        for i in range(10):
            self.x()        # <-- self will refer to the calling instance
                            #     implementation of x(self)


class B(A):

    def x(self):
        print("Hello World")


class C(A):

    def x(self):
        print("Hello StackOverflow")



b = B()
b.x()

c = C()
c.x()

b.do_x_ten_times()

谢谢!我太蠢了!编辑:我发布的代码只是我快速制作一个更大脚本的简单版本,结果,我犯了完全相同的错误。 - nyquil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接