我有许多
Python类型来描述层次结构,因为它们在属性方面越来越具体.这是一个例子,而不是试图用文字描述它:
class A:
@property
def prop1(self):
return self._prop1
class B:
@property
def prop1(self):
return self._prop1
@property
def prop2(self):
return self._prop2
class C:
@property
def prop1(self):
return self._prop1
@property
def prop2(self):
return self._prop2
@property
def prop3(self):
return self._prop3
因此,当您进入班级列表时,B具有A的所有属性,然后是一些额外的属性. C具有B的所有属性,然后是一些额外的属性,依此类推.如果可能的话,我想尽量减少上述定义的重复.
一个明显的解决方案是使用继承,使B成为A的子类,依此类推.但是,这些类型的语义不遵循is-a关系;我不希望isinstance(bObject,A)为True.在Python中是否有另一种方法可以直接允许在不使用子类的情况下共享属性?
最佳答案 你可以使用装饰器:
def has_prop1(cls):
@property
def prop1(self):
return self._prop1
cls.prop1 = prop1
return cls
@has_prop1
class A(object):
pass
合成将如下:
@has_prop1
@has_prop2
class B(object):
pass
或者甚至像这样:
def has_many_properties(cls):
return has_prop1(has_prop2(has_prop3(cls)))
@has_many_properties
class C(object):
pass