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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top