一種のラッパー クラスを実装するために継承または委任を使用する必要があるかどうかを考えています。私の問題は次のようなものです: という名前のクラスがあるとし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)これに似たケースで、必要な場合
- いくつかの機能を追加
- 一部の機能の名前を変更
- それ以外の場合は「基本クラス」機能を使用してください
- 「基本クラス」オブジェクトを「サブクラス」オブジェクトに変換します
継承または委任を使用する必要がありますか? (または、他の何か?)
Anaconda
B) 洗練された解決策は、委譲に加えて、 のインスタンスに応答しないすべての属性およびメソッド アクセスを転送するいくつかの特別なメソッドを使用することですPython
。