我试图重新自学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:未定义名称'x'。”
我明白为什么做这样的事情可能并不典型,而我的直觉说这可能违反了某些多态性规则。如果确实需要,可以将 do_x_ten_times()复制到两个类 B 和 C 中,并在 A 。但是我想知道是否有任何合理的方法可以避免重复此代码。
答案 0 :(得分:3)
您需要在self.x()
中致电A.do_x_ten_times()
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()