4

我正在考虑是否应该使用继承或委托来实现一种包装类。我的问题是这样的:假设我有一个名为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

4

1 回答 1

7

B)一个优雅的解决方案是使用委托加上一些特殊的方法来转发 Anaconda 不响应其 Python 实例的所有属性和方法访问。

这在 Python 中很简单,只需定义__getattr__

class Anaconda:

    def __init__(self, python):
        self.python = python

    def wriggle(self):
        self.python.snake()


    def devourCrocodile(self, croc):
        ...

    def __getattr__(self, name):
        return getattr(self.python, name)

请参阅 Python 文档__getattr__

于 2012-05-22T14:58:35.943 回答