我正在尝试重新学习 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中使其成为抽象方法。但我想知道是否有任何合理的方法可以避免重复这段代码。