我在思考是否应该使用继承还是委托来实现一种包装类。我的问题是这样的:假设我有一个名为Python
的类。
class Python:
def __init__(self):
...
def snake(self):
""" Make python snake through the forest"""
...
def sleep(self):
""" Let python sleep """
...
...以及更多的行为。现在我有一些现有的代码,它期望一个Anaconda
,这几乎就像一个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
我希望用Python
创建一个工具,并且能够将其转换成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
实例。
Anaconda
是否应该同时执行snake()
或仅执行wriggle()
并拒绝执行snake()
,就好像它没有被实现一样? - Tobias Kienzler