【发布时间】:2019-10-30 09:49:54
【问题描述】:
我正在尝试重新自学 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 两个类中,并在 中使其抽象化一个。但我想知道是否有任何合理的方法可以不必重复此代码。
【问题讨论】:
标签: python inheritance polymorphism abstract-class subclass