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 の method2 が Object3 の method1 から呼び出される代わりに (私が望む動作)、Object3 の method2 が呼び出されます (例外が発生します)。Object3 を変更せずに、希望する動作を実現する方法はありますか?