3

プロパティに関してますます具体的になるという意味で階層を記述する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あり、次にいくつかの追加のプロパティがあります。可能であれば、上記の定義の重複を最小限に抑えたいと思います。

明らかな解決策の1つは、継承を使用してB、のサブクラスを作成するAことです。ただし、これらのタイプのセマンティクスはis-a関係に従いません。なりたくisinstance(bObject, A)ないTrue。サブクラスを使用せずにこの属性の共有を簡単に許可するPythonの代替方法はありますか?

4

2 に答える 2

7

デコレータを使用できます。

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
于 2012-07-17T16:10:07.030 に答える
0

「嘘をつきたくないのですが、実際にはそうではないのにCはAであると言いたくありません。型の特性は、サブクラス化のセマンティクスに適合しません。」あいまいな例では、どちらに進むべきかが明確ではありません。

class Aに適用されない追加機能があるためにこれを言っている場合は、class Cクラスのプロパティ部分を構成的に引き上げます。したがって、、、をそれぞれ含み、プロパティクラスに適切な継承を与えます。関係。ABCAPropsBPropsCProps

そのような追加機能がなく、プロパティが表示どおりに構築されているのは偶然ではない場合は、精神的に名前class Aclass ProvidesProp1に変更します。これは-class Cを提供するクラスであり、したがってprop1-を受け入れます。class Cclass A

于 2012-07-17T18:47:40.047 に答える