【发布时间】:2011-04-26 05:46:21
【问题描述】:
我有一个类层次结构,其中class Base 中的__init__ 执行一些预初始化,然后调用方法calculate。 calculate 方法在class Base 中定义,但预计会在派生类中重新定义。重新定义的calculate会用到一些只有class Derived才有的属性:
class Base:
def __init__(self, args):
# perform some pre-initialization
...
# now call method "calculate"
self.calculate()
class Derived(Base):
def __init__(self, args, additional_attr):
super().__init__(args)
# do some work and create new instance attributes
...
self.additional_attr = additional_attr
这是行不通的,因为 class Derived 中的 calculate 方法将在 self.additional_attr 被分配之前被调用。
我无法将super().__init__(args) 调用移到__init__ 方法的末尾,因为它所做的一些工作必须在处理additional_attr 之前发生。
怎么办?
【问题讨论】:
-
有很多疯狂的方法可以解决这个问题,但没有理智的方法。
-
也许你不应该在你的构造函数中调用
calculate()。如果您不能通过允许基本构造函数首先完成来构造派生对象,那么您一定是做错了恕我直言。 -
我认为拥有一个依赖于基类中不存在的子类属性的专门的 calculate() 方法是 OO 滥用。通过构建的交叉依赖关系。反对将功能从
Base.calculate()拆分为Derived.additional_calculate()的有力论据是什么?我们可以给Base.additional_calculate()一个空的身体。 (或者至少,改进对尚不存在的附加数据的处理,使其更加优雅?)
标签: python class design-patterns