【发布时间】:2016-07-04 18:32:20
【问题描述】:
我有一种情况,基类方法(Python 中的__init__ 方法)做了很多工作。派生类覆盖__init__ 以简单地设置一个对象变量,然后委托给基类__init__。这工作正常,但现在我有一个情况。
我有一些代码完全适合基类__init__,所有其他派生类除了一个(称之为A)都需要使用。想象一下,如果基类__init__ 是这样的。
def __init__(self):
Action 1...
Action 2...
现在,所有派生类都直接委托给这个类。但是,A 的__init__ 中应该只有操作 2。现在的位置很丑。我可以将动作 1 和动作 2 拆分为两个单独的函数,并让基类简单地调用 Action2。然后大多数类的初始化都是这样的。
def __init__(self):
self.Action1()
Other init code...
super().__init__()
对于A 类,它将是
def __init__(self):
Some init code....
super().__init__()
但是你可以看到有一段代码(对self.Action1 的调用)我必须在大多数派生类中重复。这是不好的。我不确定如何用最少的重复代码优雅地编写代码,并且需要一些关于如何做到这一点的建议。
【问题讨论】:
-
典型的答案是也许A真的不是子类。考虑将 A 作为父级(在层次结构中较高,而不是较低)
-
在
A调用super().__init__()后你能撤消Action1吗? -
类属性,用于描述要执行的操作和
__init__中的逻辑来执行它们 - 然后A会覆盖该属性? -
@NoufalIbrahim,我知道 A 是个孩子。我是说也许它不应该是一个孩子,或者也许某些东西应该在你的父母之上,而 A 是从那里派生出来的。
-
您是否考虑过使用合成解决方案?也许应该有一个对象可以做
Action1,它可以是其他孩子的成员(不是A)。另一个动作是通过继承来完成的。
标签: python class oop inheritance