私がやりたいのはクラス変数の宣言ですが、実際にはそれらをインスタンスの変数として使用します。私は次のようなクラスField
とクラスを持っていThing
ます:
class Field(object):
def __set__(self, instance, value):
for key, v in vars(instance.__class__).items():
if v is self:
instance.__dict__.update({key: value})
def __get__(self, instance, owner):
for key, v in vars(instance.__class__).items():
if v is self:
try:
return instance.__dict__[key]
except:
return None
class Thing(object):
foo = Field()
したがって、Thingをインスタンス化して属性fooを設定すると、クラスではなくインスタンスに追加され、クラス変数が実際に再設定されることはありません。
new = Thing()
new.foo = 'bar'
# (foo : 'bar') is stored in new.__dict__
これはこれまでのところ機能しますが、上記のFieldのコードはかなり扱いにくいものです。クラスpropsでFieldオブジェクトインスタンスを探しすぎています。そうしないと、とのプロパティ()の名前を知る方法がないようfoo
です。これを達成するための別のより簡単な方法はありますか?__set__
__get__