Potrzebuję sposobu na sprawdzenie klasy, aby móc bezpiecznie określić, które atrybuty są atrybutami klasy zdefiniowanymi przez użytkownika. Problem polega na tym, że funkcje takie jak dir(), inspect.getmembers() i przyjaciele zwracają wszystkie atrybuty klas, w tym predefiniowane, takie jak: __class__
, __doc__
, __dict__
, __hash__
. Jest to oczywiście zrozumiałe i można by argumentować, że mógłbym po prostu zrobić listę nazwanych członków do zignorowania, ale niestety te predefiniowane atrybuty muszą się zmieniać wraz z różnymi wersjami Pythona, przez co mój projekt może być zmieniony w projekcie Pythona - i nie lubię tego.Sprawdzanie atrybutów klasy Pythona
przykład:
>>> 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']
W powyższym przykładzie I chce bezpieczny sposób, aby odzyskać tylko zdefiniowanej przez użytkownika klasy atrybutów [ „a”, „b”] Za „c”, jak to jest atrybutem wystąpienie . Więc moje pytanie brzmi ... Czy ktoś może mi pomóc z powyższą fikcyjną funkcją get_user_attributes(cls)
?
P.S. Spędziłem trochę czasu, próbując rozwiązać problem, analizując klasę na poziomie AST, która byłaby bardzo łatwa. Ale nie mogę znaleźć sposobu przekonwertowania już przeanalizowanych obiektów do drzewa węzłów AST. Zgaduję, że wszystkie informacje AST są odrzucane, gdy klasa została skompilowana do kodu bajtowego.
poważaniem Jakob
Wspominasz, że próbujesz to zrobić w AST. Czy to oznacza, że chcesz tylko atrybuty, które są zdefiniowane bezpośrednio na klasie, a nie na jej nadklasach? Rozumiem, że nie chcesz tych "wbudowanych", ale jestem zdezorientowany w tej kwestii. – aaronasterling