atributos de classe com um nome “calculado”
-
06-09-2019 - |
Pergunta
Ao definir atributos de classe através de nomes "calculado", como em:
class C(object):
for name in (....):
exec("%s = ..." % (name,...))
há uma maneira diferente de lidar com as inúmeras definições de atributos do que usando um executivo? getattr (C, nome) não funciona porque C não está definido, durante a construção de classe ...
Solução
Como sobre: ??
class C(object):
blah blah
for name in (...):
setattr(C, name, "....")
Isto é, fazer o ajuste atributo após a definição.
Outras dicas
class C (object):
pass
c = C()
c.__dict__['foo'] = 42
c.foo # returns 42
Se toda a sua classe é "calculada", então posso sugerir o que pode ser chamado type
. Isto é especialmente útil se o seu recipiente original era um dicionário:
d = dict(('member-%d' % k, k*100) for k in range(10))
C = type('C', (), d)
Isto lhe daria os mesmos resultados que
class C(object):
member-0 = 0
member-1 = 100
...
Se suas necessidades são realmente complexo, considere metaclasses. (Na verdade, type
é a metaclass =)
Que tal usar metaclasses para este fim?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow