Могу ли я точно имитировать поведение наследования с делегированием по композиции в 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()
Вместо метода 2 из Object4, вызываемого из метода 1 из Object3 (нужное мне поведение), вызывается метод 2 из Object3 (и возникает исключение). Есть ли способ достичь желаемого поведения без внесения изменений в Object3?
1 ответ
Поскольку нет ссылки на экземпляр Object4 (obj4), доступный классу Object3, он будет вызывать метод self2, то есть Object3.
Этот ответ может дать больше ясности и возможного решения.