Проверка атрибутов класса python

Мне нужен способ проверки класса, чтобы я мог безопасно определить, какие атрибуты являются определяемыми пользователем атрибутами класса. Проблема в том, что такие функции, как dir (), inspect.getmembers () и его друзья, возвращают все атрибуты класса, включая предопределенные, например: __ class __ , __ doc __ , __ dict __ , __ хэш __ . Это, конечно, понятно, и можно было бы возразить, что я мог бы просто составить список именованных членов, которые нужно игнорировать, но, к сожалению, эти предопределенные атрибуты должны изменяться с разными версиями Python, поэтому мой проект может быть изменен в проекте python - и мне это не нравится.

пример:

>>> 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']

В приведенном выше примере я хочу безопасный способ получить только определенные пользователем атрибуты класса ['a', 'b'], а не 'c', поскольку это атрибут экземпляра. Итак, мой вопрос ... Может ли кто-нибудь помочь мне с описанной выше фиктивной функцией get_user_attributes (cls) ?

PS Я потратил некоторое время, пытаясь решить проблему, анализируя класс на уровне AST, который быть очень легким. Но я не могу найти способ преобразовать уже проанализированные объекты в дерево узлов AST. Я думаю, вся информация AST отбрасывается после компиляции класса в байт-код.

С уважением, Якоб

32
задан Jakob Simon-Gaarde 22 November 2010 в 00:00
поделиться