クラスを定義しながら、pythonで指定された名前のクラス属性を設定します
質問
私はこのような何かをしようとしています:
property = 'name'
value = Thing()
class A:
setattr(A, property, value)
other_thing = 'normal attribute'
def __init__(self, etc)
#etc..........
しかし、私はちょうどクラス定義で変数を割り当てると同じように動作するようにsetattr
を取得するクラスへの参照を見つけることができないようです。私はこれを行うことができますどのように?
解決
あなたはこのためにメタクラスを使用する必要があります:
property = 'foo'
value = 'bar'
class MC(type):
def __init__(cls, name, bases, dict):
setattr(cls, property, value)
super(MC, cls).__init__(name, bases, dict)
class C(object):
__metaclass__ = MC
print C.foo
他のヒント
あなたはそれをさらに簡単に行うことができます
class A():
vars()['key'] = 'value'
前の回答とは対照的に、このソリューションは、外部のメタクラス(例について、Djangoのモデル)とよく果たしています。
A
を行うときに、クラスのsetattr(A, p, v)
が完全に初期化されていないため、このであってもよいです。
しようとする最初の事はただ、例えばダウンあなたはclass
ブロックを閉じた後にsettattrを移動し、その作品かどうかを確認することです。
タグ
class A(object):
pass
setattr(A, property, value)
それ以外の場合は、<のhref = "https://stackoverflow.com/questions/2519807/setting-an-class-attribute-with-a-given-name-in-python-while-defining-the-class/ 2519895#2519895" >事イグナシオはちょうど約メタクラスを言った。
は、私が知っているので、これは本当に古い、おそらく死んだ馬を破っであり、これは私自身の問題を解決しようとするこのまたがった時間が、私のカムで可能となっていない可能性があります。
私は、これはmetaclassingすることなく達成することができる実現します。
SETATTRがかかり、オブジェクト、アクセサ名、および値。まあオブジェクトは、それが自己を実現することができるクラスの特定のインスタンスのクラス名ではありません。
class A(object):
def __init__(self):
self.a = 'i am a accessor'
setattr(self, 'key', 'value')
a = A()
print a.a
print a.key