Pergunta

Usando Python Eu quero criar uma propriedade em uma classe, mas ter o nome dele em uma string. Normalmente você faz:

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

onde get_, set_ e del_blah foram definidos em conformidade. Eu tentei fazer o mesmo com o nome da propriedade em uma variável, como este:

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

Mas isso não funciona. O primeiro blah caso retorna o valor da propriedade, no segundo caso, ele retorna uma propriedade, que é <property object at 0xbb1aa0>. Como devo defini-lo para que ele funciona?

Foi útil?

Solução

Por mais que eu diria, a diferença é que, na primeira versão, você alterar o blá atributo classes para o resultado da propriedade e no segundo você configurá-lo na instância (que é diferente!).

Como sobre esta versão:

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

Você também pode fazer isso:

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

Outras dicas

Uma maneira é escrever em locals ():

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 eu entender o que você está tentando fazer, você pode realizá-lo, substituindo a classe getattr e < strong> setattr métodos.

Por exemplo:

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

Será imprimir:

You're getting foo
You're getting bar

Desta forma, você pode ter um getter genéricos e setter que tem o nome da propriedade em uma corda e faz algo com eles em conformidade.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top