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

Jas*_*n R 3 python properties

我有许多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
Run Code Online (Sandbox Code Playgroud)

因此,当您进入类列表时,B具有所有属性,A然后是一些额外的属性.C具有所有属性,B然后是一些额外的属性,依此类推.如果可能的话,我想尽量减少上述定义的重复.

一个显而易见的解决方案是使用继承,创建B子类A等等.但是,这些类型的语义不遵循is-a关系; 我不想isinstance(bObject, A)成为True.在Python中是否有另一种方法可以直接允许在不使用子类的情况下共享属性?

orl*_*rlp 7

你可以使用装饰器:

def has_prop1(cls):
    @property
    def prop1(self):
        return self._prop1

    cls.prop1 = prop1

    return cls

@has_prop1
class A(object):
    pass
Run Code Online (Sandbox Code Playgroud)

合成将如下:

@has_prop1
@has_prop2
class B(object):
    pass
Run Code Online (Sandbox Code Playgroud)

或者甚至像这样:

def has_many_properties(cls):
    return has_prop1(has_prop2(has_prop3(cls)))

@has_many_properties
class C(object):
    pass
Run Code Online (Sandbox Code Playgroud)