Pregunta

Utilizando Python, quiero crear una propiedad en una clase, pero tener el nombre en una cadena. Normalmente lo haces:

blah = property(get_blah, set_blah, del_blah, "bleh blih")

donde get_, set_ y del_blah se han definido en consecuencia. Intenté hacer lo mismo con el nombre de la propiedad en una variable, como esta:

setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))

Pero eso no funciona. El primer caso blah devuelve el valor de la propiedad, en el segundo caso, devuelve una propiedad, que es <property object at 0xbb1aa0>. ¿Cómo debo definirlo para que funcione?

¿Fue útil?

Solución

Por mucho que diría, la diferencia es que en la primera versión, cambias el atributo de las clases bla por el resultado de la propiedad y en la segunda lo configuras en la instancia (¡lo cual es diferente!).

¿Qué tal esta versión?

setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))

también puedes hacer esto:

setattr(type(self), "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))

Otros consejos

Una forma es escribir en 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

da

a_value
b_value
c_value

Si entiendo lo que está tratando de hacer, puede lograrlo anulando getattr y < métodos strong> setattr .

Por ejemplo:

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

Imprimirá:

You're getting foo
You're getting bar

De esta forma, puede tener un captador y definidor genérico que tenga el nombre de la propiedad en una cadena y haga algo con él en consecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top