我有一个基类和一些用 Python 派生的类:
class Base:
def Foo(self):
pass
# First derived class
class Der1(Base):
def OwnFoo(self):
# Do something 1
def OwnFoo2(self):
# Do something 2
def Foo(self):
# Do something 3
# Second derived class
class Der2(Base):
def OwnFoo(self):
# Do something 1
def OwnFoo2(self):
# Do something 2
def Foo(self):
# Do something 3
问题是:
我在 Der1 中有一些预定义代码。 Der2 中的几乎所有函数都执行相同的操作。我怎样才能用更少的代码写这个?
我无法将该代码添加到父级。不应触及父类。
例如,Der2.OwnFoo 与 Der1.OwnFoo 的作用相同,也许 python 中有一些构造只是为了从中调用 OwnFoo头等舱而不是再次编写该代码?
我无法更改 Der1 和 Der2 的父级!它应该是 Base。
请您参考如下方法:
由于您无法更改继承结构,因此制作一个包含公共(public)代码的辅助类并通过composition 包含它。而不是继承。
# Common code goes in this new class
class DerHelper:
def __init__(self, parent):
self._parent = parent
def OwnFoo(self):
print 'Do something 1', self._parent
def OwnFoo2(self):
print 'Do something 2', self._parent
def Foo(self):
print 'Do something 3', self._parent
# First derived class
class Der1(Base):
def __init__(self):
# include helper class by composition
self._helper = DerHelper('Der1')
def OwnFoo(self):
self._helper.OwnFoo()
def OwnFoo2(self):
self._helper.OwnFoo2()
def Foo(self):
self._helper.Foo()
# Second derived class
class Der2(Base):
def __init__(self):
# include helper class by composition
self._helper = DerHelper('Der2')
def OwnFoo(self):
self._helper.OwnFoo()
def OwnFoo2(self):
self._helper.OwnFoo2()
def Foo(self):
self._helper.Foo()
当然,您可以传递对父级的引用而不是字符串。我这样做只是为了演示目的。
用法:
d = Der1()
d.OwnFoo()
d.OwnFoo2()
d.Foo()
d = Der2()
d.OwnFoo()
d.OwnFoo2()
d.Foo()
输出:
Do something 1 Der1
Do something 2 Der1
Do something 3 Der1
Do something 1 Der2
Do something 2 Der2
Do something 3 Der2
