4

一種のラッパー クラスを実装するために継承または委任を使用する必要があるかどうかを考えています。私の問題は次のようなものです: という名前のクラスがあるとし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)これに似たケースで、必要な場合

  • いくつかの機能を追加
  • 一部の機能の名前を変更
  • それ以外の場合は「基本クラス」機能を使用してください
  • 「基本クラス」オブジェクトを「サブクラス」オブジェクトに変換します

継承または委任を使用する必要がありますか? (または、他の何か?)

AnacondaB) 洗練された解決策は、委譲に加えて、 のインスタンスに応答しないすべての属性およびメソッド アクセスを転送するいくつかの特別なメソッドを使用することです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 に答える