Atributos de clase con un nombre “calculado”
-
06-09-2019 - |
Pregunta
Al definir atributos de clase a través de nombres "calculado", como en:
class C(object):
for name in (....):
exec("%s = ..." % (name,...))
hay una manera diferente de la manipulación de las numerosas definiciones de atributos que usando un exec? getattr (C, nombre) no funciona debido a que C no está definida, durante la construcción de clase ...
Solución
¿Qué hay de:
class C(object):
blah blah
for name in (...):
setattr(C, name, "....")
Es decir, hacer el atributo de configuración después de la definición.
Otros consejos
class C (object):
pass
c = C()
c.__dict__['foo'] = 42
c.foo # returns 42
Si toda la clase se "calcula", a continuación, me permito sugerir la type
exigible. Esto es especialmente útil si su envase original era un diccionario:
d = dict(('member-%d' % k, k*100) for k in range(10))
C = type('C', (), d)
Esto le daría el mismo resultado que
class C(object):
member-0 = 0
member-1 = 100
...
Si sus necesidades son muy complejos, considere metaclases. (De hecho, type
es una metaclase =)
¿Qué pasa con el uso de metaclases para este fin?