0

クラスまたはそのサブクラスのすべてのインスタンスで共有できるクラスプロパティを設定したいと思います。どのインスタンスでもプロパティを設定できるはずです。

私は次のことを試しました:

class A:
    x = 1
    @classmethod
    def setX(cls, val):
        if cls.__bases__:
            cls = cls.__bases__[-1]
        cls.x = val

これは、単一継承の場合に正常に機能するようです。しかし、継承の順序に応じて、多重継承を使用する場合、それは機能するか機能しないかのどちらかです(つまり、クラスAは常に最後の塩基であるとは限りません)。

堅牢な実装のためのアイデアはありますか?

4

2 に答える 2

2

字句スコープを使用します。

class A(object):
    x = 1
    @classmethod
    def setX(cls, val):
        A.x = val
于 2012-04-15T00:40:42.773 に答える
1

正しい方法、IMO は、クラス プロパティを使用することです。__dict__オブジェクト自体の とは対照的に、プロパティはオブジェクトの classes に結び付けられている__dict__ため、オブジェクトはたまたまクラスであるため、それをクラス クラス、そのメタクラスにアタッチする必要があります。

class A(object):

    _x = None

    class __metaclass__(type):

        @property
        def x(cls):
            return A._x

        @x.setter
        def x(cls, val):
            A._x = val


class B(A):
    pass

A.x = 'jim'
B.x = 'joe'

print A.x, B.x

結果:

joe joe

また、クラスは新しいスタイルのクラスでなければなりません。つまりobject、Python 2.xから継承する必要があります。また、Python 3.x ではメタクラスの定義が異なります。

class MetaA(type):
    """ like ___metaclass__ above """

class A(metaclass=MetaA):

    _x = None

...
于 2012-04-15T01:20:34.737 に答える