Domanda

Usando Python voglio creare una proprietà in una classe, ma avendone il nome in una stringa. Normalmente fai:

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

dove get_, set_ e del_blah sono stati definiti di conseguenza. Ho provato a fare lo stesso con il nome della proprietà in una variabile, in questo modo:

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

Ma non funziona. Il primo caso blah restituisce il valore della proprietà, nel secondo caso restituisce una proprietà, ovvero <property object at 0xbb1aa0>. Come devo definirlo in modo che funzioni?

È stato utile?

Soluzione

Per quanto direi, la differenza è che nella prima versione, si modifica l'attributo class blah sul risultato della proprietà e nel secondo lo si imposta sull'istanza (che è diverso!).

Che ne dici di questa versione:

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

puoi anche fare questo:

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

Altri suggerimenti

Un modo è scrivere nei locali ():

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

Se capisco cosa stai cercando di fare, potresti realizzarlo sovrascrivendo getattr e < strong> setattr metodi.

Ad esempio:

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

Stampa:

You're getting foo
You're getting bar

In questo modo puoi avere un getter e setter generico che ha il nome della proprietà in una stringa e fa qualcosa con esso di conseguenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top