【问题标题】:Can I exactly mimic inheritance behavior with delegation by composition in Python?我可以在 Python 中通过组合委托完全模仿继承行为吗?
【发布时间】:2017-07-04 10:02:04
【问题描述】:

在 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()

不是从 Object3 的 method1 调用来自 Object4 的 method2(我想要的行为),而是调用来自 Object3 的 method2(并引发异常)。有什么方法可以在不更改 Object3 的情况下实现我想要的行为?

【问题讨论】:

    标签: python inheritance object-composition


    【解决方案1】:

    由于没有对 Object3 类可用的 Object4 实例(obj4)的引用,它将调用自身的方法 2,即 Object3。

    This answer 可能会提供更清晰和可能的解决方案。

    【讨论】:

    • 我认为这不是我想要的。问题是父类可以变化,所以继承不是一种选择。
    • @Charlee ,在这种情况下,我看到的解决方案是更改 Object3。让 Onject3 中的 method1 引用 def method1(self, ref): print "This is method 1 from object 3" return ref.method2() 然后像这样调用它们:obj4 = Object4() obj4.method1(obj4) 编辑:格式搞砸了,抱歉
    • 不幸的是我不能这样做 :( 看到方法 2 确实存在于 Object3 中,并且在某些情况下会像这样使用。如果我改变方法 2 的调用方式,我会弄乱现有的代码. 不可以也没关系,我想我有另一种解决方案,我主要是好奇这是否可行,到目前为止似乎并非如此。
    • @Charlee 很遗憾听到,祝你的其他解决方案好运:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多