Pregunta

Para obtener todos los atributos de clase definidos intento ir con

TheClass.__dict__

pero eso también me da los atributos especiales. ¿Hay una manera de obtener sólo los atributos autodefinidos o tengo para "limpiar" el mismo dict?

¿Fue útil?

Solución

Otra solución:

class _BaseA(object):
    _intern = object.__dict__.keys()

class A(_BaseA):
    myattribute = 1

print filter(lambda x: x not in A._intern+['__module__'], A.__dict__.keys())

No creo que esto es terriblemente robusto y que aún puede haber una mejor manera.

Esta dirección hace algunas de las cuestiones básicas de algunas de las otras respuestas apuntaban a:

  • No hay necesidad de 'name convention'-filtrado basado
  • Proporcionar a su propia implementación de métodos mágicos, por ejemplo, __len__ hay ningún problema (define en A).

Otros consejos

No se puede limpiar el __dict__:

AttributeError: attribute '__dict__' of 'type' objects is not writable

Se puede confiar en la convenciones de nombres :

class A(object):
    def __init__(self, arg):
        self.arg = arg

    class_attribute = "01"    

print [ a for a in A.__dict__.keys() 
        if not (a.startswith('__') and a.endswith('__')) ]

# => ['class_attribute']

Esto puede no ser fiable, ya que por supuesto puede sobrescribir o implementar especial / magia métodos como __item__ o __len__ en su clase.

No creo que haya nada sencillo, y por qué habría? No hay diferencia de idioma reforzada entre la magia y atributos definidos por el usuario.

La solución de MYYN no funcionará si tiene un atributo definido por el usuario que empiezan con '__'. Sin embargo, sí sugiere una solución basada en las convenciones:. Si desea realizar una introspección de sus propias clases, puede definir su propia convención de nombres, y el filtro en ese

Tal vez si se le explica la necesidad de que podamos encontrar una solución mejor.

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