我想将属性值传递给派生类以进行数据管理。直观地,代码应该表现得像:
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哲学“应该有一个 - 最好只有一个 - 显而易见的方法。”
谢谢!
答案 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
编辑:继承与构成的澄清:
当您想要从另一个类继承代码或行为而不是内部状态(数据)时,继承可以很好地工作。您似乎希望有两个表示不同数据的独立对象,并将它们合并在一起。
对于这个问题,你很可能需要组合 - 而不是继承,因为你仍然会有两个整齐分离的对象代表数据。