Pythonic方法在类之间继承属性值

时间:2015-12-29 19:48:23

标签: python inheritance

我想将属性值传递给派生类以进行数据管理。直观地,代码应该表现得像:

class Cls1(object):
    def __init__(self, attribute_1):
        self.attribute_1 = attribute_1

class Cls2(object):
    def __init__(self, attribute_2=2):
        self.attribute_2 = attribute_2


cls1 = Cls1(1)
cls2 = Cls2(cls1)
cls2.<tab>

## ideal output should be:
cls2.attribute_1  # this should give whatever value I set in cls1
cls2.attribute_2  # this should give default value 2

我知道,在python中,类通常继承方法但不继承属性值。似乎suepr().__init__()或自定义metaclass可以做类似的工作,但不完全按照我描述的方式。

我想知道是否有更好的方法可以做到这一点,比如Python哲学“应该有一个 - 最好只有一个 - 显而易见的方法。”

谢谢!

1 个答案:

答案 0 :(得分:0)

你的例子不是真正的继承,更像是组合(一个对象包裹在另一个对象中)。您可以采用的一种方法是使用一种方法捕获所有未定义的属性请求(__getattr__),并将它们转发给您的包装对象。

class Cls1(object):
    def __init__(self, attribute_1):
        self.attribute_1 = attribute_1

class Cls2(object):
    def __init__(self, obj):
        self.wrapped_obj = obj 
        self.attribute_2 = 2

    def __getattr__(self,name):
        # get in here only when attribute requested is not defined.
        # for Cls2. let's try to get it from our wrapped Cls1 
        # object instead.
        return getattr(self.wrapped_obj, name)


cls1 = Cls1(1)
cls2 = Cls2(cls1)

## ideal output should be:
print cls2.attribute_1  # outputs 1
print cls2.attribute_2  # outputs 2

编辑:继承与构成的澄清:

当您想要从另一个类继承代码或行为而不是内部状态(数据)时,继承可以很好地工作。您似乎希望有两个表示不同数据的独立对象,并将它们合并在一起。

对于这个问题,你很可能需要组合 - 而不是继承,因为你仍然会有两个整齐分离的对象代表数据。