2012-04-15 7 views
0

クラスまたはそのサブクラスのすべてのインスタンスで共有できるクラスプロパティを設定したいと考えています。任意のインスタンスがプロパティを設定することも可能でなければなりません。すべてのインスタンス(サブクラスも含む)がアクセスして設定できるクラスプロパティ

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

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

これは、単一継承の場合には正常に動作するようです。しかし、継承の順序に応じて複数の継承を使用する場合、継承の順番によっては、クラスAが必ずしも最後ののベースであるとは限りません()。

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

+3

セッターとゲッターはPythonで本当に悪い習慣です - あなたが実際に何か、この質問のためだけの例であれば、私が言うことができない、または行う。後者の場合は、["' property() ''組み込み関数/デコレータ@]をチェックしてください。 –

+0

'A.x'を使うだけで動作しませんか? –

答えて

1

正しい方法は、IMO、クラスのプロパティで行くことです。

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 

結果:オブジェクトの非常に自身の__dict__、あなたのオブジェクトがクラスをあることを起こるので、あなたはクラスのクラスにアタッチする必要があり、そのメタクラスとは対照的に、プロパティは、オブジェクトのクラス__dict__に縛られているので:

joe joe 

彼らは、Python 2.xではobjectから継承しなければなりません。すなわちまた、あなたのクラスは、新しいスタイルのクラスでなければなりませんそして、メタクラスは、Python 3.xの中で異なって定義されています

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

class A(metaclass=MetaA): 

    _x = None 

... 
2

レキシカルスコープの使用:

class A(object): 
    x = 1 
    @classmethod 
    def setX(cls, val): 
     A.x = val 
関連する問題