クラスを定義しながら、pythonで指定された名前のクラス属性を設定します

StackOverflow https://stackoverflow.com/questions/2519807

  •  22-09-2019
  •  | 
  •  

質問

私はこのような何かをしようとしています:

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top