Wie eine Eigenschaft mit seinem Namen in einem String erstellen?
-
06-07-2019 - |
Frage
Mit Python Ich mag eine Eigenschaft in einer Klasse schaffen, sondern die Namen es in einem String mit. Normalerweise Sie tun:
blah = property(get_blah, set_blah, del_blah, "bleh blih")
wo get_, set_ und del_blah werden entsprechend definiert. Ich habe versucht, das gleiche mit dem Namen der Eigenschaft in einer Variablen zu tun, wie folgt aus:
setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))
Aber das funktioniert nicht. Der erste Fall blah den Wert der Eigenschaft gibt, im zweiten Fall ist es eine Eigenschaft gibt, ist, dass <property object at 0xbb1aa0>
. Wie soll ich es definieren, damit es funktioniert?
Lösung
Wie viel würde ich sagen, der Unterschied ist, dass in der ersten Version, können Sie die Klassen ändern blah auf das Ergebnis der Eigenschaft Attribut und in der zweiten Sie legen Sie es auf die Instanz (das ist anders!).
Wie wäre es dieser Version:
setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
Sie können dies auch tun:
setattr(type(self), "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
Andere Tipps
Eine Möglichkeit ist, in Einheimischer zu schreiben ():
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
gibt
a_value
b_value
c_value
Wenn ich verstehe, was Sie versuchen, zu tun, könnte man es erreichen, indem die Klasse der übergeordneten getattr und < strong> setattr Methoden.
Zum Beispiel:
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
Will Druck:
You're getting foo
You're getting bar
So können Sie ein generisches Getter und Setter haben können, der den Namen der Eigenschaft in einer Zeichenkette hat und tut etwas damit entsprechend.