Necesito una forma de inspeccionar una clase para poder identificar con seguridad qué atributos son atributos de clase definidos por el usuario. El problema es que las funciones como dir(), inspect.getmembers() y amigos devuelven todos los atributos de clase incluidos los predefinidos como: __class__
, __doc__
, __dict__
, __hash__
. Esto, por supuesto, es comprensible, y se podría argumentar que podría hacer una lista de miembros nombrados para ignorar, pero desafortunadamente estos atributos predefinidos están destinados a cambiar con diferentes versiones de Python, lo que hace que mi proyecto sea modificable en el proyecto python. - y no me gusta eso.Inspeccionar los atributos de la clase python
ejemplo:
>>> class A:
... a=10
... b=20
... def __init__(self):
... self.c=30
>>> dir(A)
['__doc__', '__init__', '__module__', 'a', 'b']
>>> get_user_attributes(A)
['a','b']
En el ejemplo anterior quiero una manera segura para recuperar sólo la clase definida por el usuario atributos [ 'a', 'b'] no 'c', ya que es un atributo de instancia . Entonces mi pregunta es ... ¿Alguien me puede ayudar con la función ficticia anterior get_user_attributes(cls)
?
P.S. He dedicado un tiempo a tratar de resolver el problema analizando la clase en AST, lo que sería muy fácil. Pero no puedo encontrar una forma de convertir objetos ya analizados a un árbol de nodos AST. Supongo que toda la información AST se descarta una vez que una clase ha sido compilada en bytecode.
Saludos Jakob
Menciona que ha estado tratando de hacerlo en la AST. ¿Eso significa que solo quieres atributos que se definan inmediatamente en la clase y no en sus superclases también? Reconozco que no quieres los 'integrados', pero estoy confundido sobre este tema. – aaronasterling