如何在Python中没有is-a关系的情况下共享属性?

我有许多
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
点赞