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 ...

¿Fue útil?

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?

Pregunta 100003: ¿Qué es una metaclase en Python ?.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top