Мне нужен способ проверки класса, чтобы я мог безопасно определить, какие атрибуты являются определяемыми пользователем атрибутами класса. Проблема в том, что такие функции, как dir (), inspect.getmembers () и друзья, возвращают все атрибуты класса, включая предопределенные, такие как: __class__
, __doc__
, __dict__
, __hash__
. Это, конечно, понятно, и можно было бы возразить, что я мог бы просто составить список именованных членов, которые нужно игнорировать, но, к сожалению, эти предопределенные атрибуты обязательно изменятся с разными версиями 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)
?
P.S. Я потратил некоторое время, пытаясь решить проблему, проанализировав класс на уровне AST, что было бы очень просто. Но я не могу найти способ преобразовать уже проанализированные объекты в дерево узлов AST. Я предполагаю, что вся информация AST отбрасывается после того, как класс был скомпилирован в байт-код.
С уважением, Якоб