文字列に名前を持つプロパティを作成する方法は?
-
06-07-2019 - |
質問
Pythonを使用して、クラスにプロパティを作成したいのですが、文字列にその名前があります。通常は次のようにします:
blah = property(get_blah, set_blah, del_blah, "bleh blih")
get_、set_、およびdel_blahは、それに応じて定義されています。次のように、変数内のプロパティの名前で同じことをしようとしました:
setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))
しかし、それは機能しません。最初の場合のblahはプロパティの値を返し、2番目の場合は<property object at 0xbb1aa0>
のプロパティを返します。動作するように定義するにはどうすればよいですか?
解決
私が言うように、違いは、最初のバージョンでは、classs属性blahをプロパティの結果に変更し、2番目ではインスタンスに設定するということです(異なる!)。
このバージョンはどうですか:
setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
これも行うことができます:
setattr(type(self), "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
他のヒント
1つの方法は、locals()に書き込むことです:
class X:
for attr in ["a","b","c"]:
def getter(self, name=attr):
return name+"_value"
locals()[attr] = property(getter, None, None, attr)
x = X()
print x.a
print x.b
print x.c
与える
a_value
b_value
c_value
あなたがやろうとしていることを理解していれば、クラスの getattr および < strong> setattr メソッド。
例:
class Something(object):
def __getattr__(self, name):
# The name of the property retrieved is a string called name
return "You're getting %s" % name
something = Something()
print something.foo
print something.bar
印刷します:
You're getting foo
You're getting bar
この方法では、文字列にプロパティの名前を持ち、それに応じて何かを行う汎用のゲッターとセッターを使用できます。
所属していません StackOverflow