Definindo um atributo de classe com um determinado nome em Python enquanto definiu a classe
Pergunta
Estou tentando fazer algo assim:
property = 'name'
value = Thing()
class A:
setattr(A, property, value)
other_thing = 'normal attribute'
def __init__(self, etc)
#etc..........
Mas não consigo encontrar a referência à classe para obter o setattr
Para trabalhar da mesma forma que apenas atribuir uma variável na definição da classe. Como posso fazer isso?
Solução
Você precisará usar um metaclasse para isso:
property = 'foo'
value = 'bar'
class MC(type):
def __init__(cls, name, bases, dict):
setattr(cls, property, value)
super(MC, cls).__init__(name, bases, dict)
class C(object):
__metaclass__ = MC
print C.foo
Outras dicas
Você pode fazer isso ainda mais simples:
class A():
vars()['key'] = 'value'
Em contraste com a resposta anterior, esta solução é bem -sucedida com metaclasses externas (para os modelos Django).
Isso pode ser porque a classe A
não é totalmente inicializado quando você faz o seu setattr(A, p, v)
lá.
A primeira coisa a tentar seria apenas mover o estabelecimento para baixo depois de fechar o class
Bloqueie e veja se isso funciona, por exemplo
class A(object):
pass
setattr (a, propriedade, valor)
Por outro lado, Aquilo que Ignacio acabou de dizer sobre metaclasses.
Então, eu sei que isso é muito velho e provavelmente batendo em um cavalo morto, e isso pode não ter sido possível na época, mas eu caminha nessa tentativa de resolver meu próprio problema.
Percebi que isso pode ser realizado sem metaclasse.
O SetATTR pega e objeto, nome do acessador e valor. Bem, o objeto não é o nome da classe, é a instância específica da classe, que pode ser realizada consigo mesmo.
class A(object):
def __init__(self):
self.a = 'i am a accessor'
setattr(self, 'key', 'value')
a = A()
print a.a
print a.key