Могу ли я точно имитировать поведение наследования с делегированием по композиции в 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.

Этот ответ может дать больше ясности и возможного решения.

Другие вопросы по тегам