Python:我应该在这里使用委托还是继承?

2024-09-27 19:27:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在考虑是否应该使用继承或委托来实现一种包装类。我的问题是这样的:假设我有一个名为Python的类。在

class Python:

    def __init__(self):
        ...

    def snake(self):
        """ Make python snake through the forest"""
        ...

    def sleep(self):
        """ Let python sleep """
        ...

。。。还有更多的行为。现在,我有了一个需要Anaconda的现有代码,它几乎类似于Python,但略有不同:一些成员的名称和参数稍有不同,而其他成员则添加了新的功能。我真的想重用Python中的代码。因此,我可以通过继承来实现:

^{pr2}$

当然我也可以打电话给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不响应其{}实例的所有属性和方法访问。在


Tags: 代码self功能initdef情况成员sleep
1条回答
网友
1楼 · 发布于 2024-09-27 19:27:46

B) An elegant solution would be to use delegation plus some special method that forwards all attribute and method accesses which Anaconda does not respond to to its instance of 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文档

相关问题 更多 >

    热门问题