Comment créer une propriété avec son nom dans une chaîne?
-
06-07-2019 - |
Question
Utilisation de Python Je veux créer une propriété dans une classe, mais en avoir le nom dans une chaîne. Normalement vous faites:
blah = property(get_blah, set_blah, del_blah, "bleh blih")
où get_, set_ et del_blah ont été définis en conséquence. J'ai essayé de faire la même chose avec le nom de la propriété dans une variable, comme ceci:
setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))
Mais ça ne marche pas. Le premier cas blah renvoie la valeur de la propriété, dans le second cas, il retourne une propriété, c'est-à-dire <property object at 0xbb1aa0>
. Comment dois-je le définir pour que cela fonctionne?
La solution
Autant que je dirais, la différence est que, dans la première version, vous modifiez l'attribut de classes blah en résultat de property et dans la seconde, vous le définissez à l'instance (qui est différente!).
Que diriez-vous de cette version:
setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
vous pouvez aussi faire ceci:
setattr(type(self), "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
Autres conseils
L’une des méthodes consiste à écrire dans des variables locales ():
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
donne
a_value
b_value
c_value
Si je comprends ce que vous essayez de faire, vous pouvez le faire en remplaçant la getattr et < strong> setattr , méthodes
Par exemple:
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
Imprimera:
You're getting foo
You're getting bar
De cette façon, vous pouvez avoir un getter et un setter générique qui porte le nom de la propriété dans une chaîne et en fait quelque chose en conséquence.