python - 在 Python 中,有什么方法可以从其父类调用子类的方法重写吗?

标签 python inheritance polymorphism abstract-class subclass

我正在尝试重新自学 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.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()

关于python - 在 Python 中,有什么方法可以从其父类调用子类的方法重写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56620507/

相关文章:

java - 通过父类(super class)对象的 ArrayList 访问子类方法?

python - 如何做一个反 `range` ,即根据一组数字创建一个紧凑的范围?

python - 在 Python 中使用 Eval 创建类变量

python - 如何动态改变属性?

python - 其他python文件中的变量,如何加载进去?

c# - 从其通用父类继承的嵌套类

perl - 驼鹿和扩展非驼鹿类

c# - 在 C# 中使用默认引用对象关系访问属性的默认值

c++ - 接口(interface)虚表

C# 创建类和派生类的实例