2017-07-04 3 views
0

は、私は、組成物によって代表団と、次の動作を模倣したい:Pythonでのコンポジションによる委譲の継承動作を正確に模倣できますか? Pythonで

class Object1(object): 

    def __init__(self): 
     pass 

    def method1(self): 
     print "This is method 1 from object 1" 
     return self.method2() 

    def method2(self): 
     raise Exception 


class Object2(Object1): 

    def method2(self): 
     print "This is method 2 from object 2" 

obj2 = Object2() 
obj2.method1() 

出力は次のようになります。つまり

This is method 1 from object 1 
This is method 2 from object 2 

、私はそのコピーのクラスを作成することができるようにしたいです特定のメソッドを除き、既存のクラスの振る舞い。しかし、いったんプログラムが既に存在するクラスのメソッドに入ると、関数をオーバーライドした場合に新しいクラスに戻ります。ただし、次のコードでこれが当てはまらない:

class Object3(object): 

    def __init__(self): 
     pass 

    def method1(self): 
     print "This is method 1 from object 3" 
     return self.method2() 

    def method2(self): 
     raise Exception 

class Object4(object): 

    def __init__(self): 
     self.obj = Object3() 

    def __getattr__(self, attr): 
     return getattr(self.obj, attr) 

    def method2(self): 
     print "This is method 2 from object 4" 

obj4 = Object4() 
obj4.method1() 

代わりのObject4から法2は、オブジェクト3(私が欲しいの行動)の法1から呼び出され、オブジェクト3から方法2と呼ばれる(と例外が発生します)。 Object3に変更を加えずに、私が望む動作を達成する方法はありますか?

答えて

0

Object3クラス(obj4)への参照はObject3クラスで使用できないため、selfのmethod2(Object3)が呼び出されます。

This answerは、より明快であり、可能な解決策を提供するかもしれない。

+0

私はこれが私が探しているとは思わない。問題は、親クラスが変わる可能性があるため、継承はオプションではないということです。 – Charlee

+0

@Charlee、その場合、私が見る解決策はObject3を変更することです。 Onject3で法1を持っている 'デフmethod1を(自己、REF)の参照を取る: 印刷 "これはオブジェクト3から方法1である" リターンref.method2()' は、そのようにようにそれらを呼び出す: 'OBJ4 = Object4 () obj4.method1(OBJ4) ' EDIT:フォーマットが台無しにされて、残念ながら、私はこれを行うことはできません –

+0

申し訳ありませんが、その方法2は、実際にすでにオブジェクト3には存在しない、といくつかのケースでのように使用されます見て:(もしmethod2の呼び出し方法を変更したら、私は既存のコードを壊してしまいます。 それができないのであれば大丈夫です。別の解決方法があると思います。これが可能であれば、私は主に好奇心が強いです。カジノじゃないe。 – Charlee

関連する問題