Obtener __dict__ objeto de clase sin atributos especiales
-
20-09-2019 - |
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?
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.