我正在考虑是否应该使用继承或委托来实现一种包装类。我的问题是这样的:假设我有一个名为Python
.
class Python:
def __init__(self):
...
def snake(self):
""" Make python snake through the forest"""
...
def sleep(self):
""" Let python sleep """
...
...以及更多的行为。现在我有一个需要 a 的现有代码Anaconda
,它几乎像 a Python
,但略有不同:一些成员的名称和参数略有不同,其他成员添加了新功能。我真的很想重用Python
. 因此我可以通过继承来做到这一点:
class Anaconda(Python):
def __init__(self):
Python.__init__(self)
def wriggle(self):
"""Different name, same thing"""
Python.snake(self)
def devourCrocodile(self, croc):
""" Python can't do this"""
...
当然我也可以打电话Anaconda().sleep()
。但这里有一个问题:PythonFactory
我需要使用一个。
class PythonFactory:
def makeSpecialPython(self):
""" Do a lot of complicated work to produce a special python"""
…
return python
我希望它制作 aPython
然后我应该能够将其转换为 a Anaconda
:
myAnaconda = Anaconda(PythonFactory().makeSpecialPython())
在这种情况下,授权将是可行的方法。(我不知道这是否可以使用继承来完成):
class Anaconda:
def __init__(self, python):
self.python = python
def wriggle(self):
self.python.wriggle()
def devourCrocodile(self, croc):
...
但是有代表团,我不能打电话Anaconda().sleep()
。
所以,如果你还在我身边,我的问题是:
A)在与此类似的情况下,我需要
- 添加一些功能
- 重命名一些功能
- 否则使用“基类”功能
- 将“基类”对象转换为“子类”对象
我应该使用继承还是委托?(或者是其他东西?)
B)一个优雅的解决方案是使用委托加上一些特殊的方法来转发所有Anaconda
不响应其实例的属性和方法访问Python
。