Definindo um atributo de classe com um determinado nome em Python enquanto definiu a classe

StackOverflow https://stackoverflow.com/questions/2519807

  •  22-09-2019
  •  | 
  •  

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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top