我正在尝试重新自学 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() 在子类 B 和 C 中的代码完全相同。因此,如果我可以将 do_x_ten_times() 的代码放在 A 中,并让 A 调用任何子类的实现,这将很方便(并且我的代码将减少重复) x() 是。不幸的是,我收到“NameError: name 'x' is not defined.”
我知道为什么做这样的事情可能不是典型的,我的直觉说它可能违反了多态性的某些规则。如果我真的需要,我可以将 do_x_ten_times() 复制到 B 和 C 类中,并在 中将其抽象化一个。但我想知道是否有任何合理的方法可以避免重复这段代码。
最佳答案
你需要在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/