Tôi cần một cách để kiểm tra một lớp để tôi có thể xác định một cách an toàn thuộc tính nào là thuộc tính lớp do người dùng định nghĩa. Vấn đề là các hàm như dir(), inspect.getmembers() và bạn bè trả về tất cả các thuộc tính lớp bao gồm các thuộc tính được xác định trước như: __class__
, __doc__
, __dict__
, __hash__
. Điều này tất nhiên là dễ hiểu, và người ta có thể lập luận rằng tôi có thể tạo một danh sách các thành viên có tên để bỏ qua, nhưng tiếc là các thuộc tính được định nghĩa trước này bị ràng buộc thay đổi với các phiên bản Python khác nhau, do đó làm cho dự án của tôi dễ thay đổi trong dự án python - và tôi không thích điều đó.Kiểm tra thuộc tính lớp python
dụ:
>>> 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']
Trong ví dụ trên, chúng tôi muốn có một cách an toàn để lấy chỉ lớp người dùng định nghĩa các thuộc tính [ 'a', 'b'] không phải là 'c' vì nó là một thuộc tính dụ . Vì vậy, câu hỏi của tôi là ... Bất cứ ai có thể giúp tôi với các chức năng trên fictive get_user_attributes(cls)
?
P.S. Tôi đã dành thời gian cố gắng giải quyết vấn đề bằng cách phân tích cú pháp lớp ở mức AST sẽ rất dễ dàng. Nhưng tôi không thể tìm thấy một cách để chuyển đổi các đối tượng đã được phân tích cú pháp thành cây nút AST. Tôi đoán tất cả các thông tin AST bị hủy bỏ khi một lớp đã được biên dịch thành bytecode.
Trân trọng Jakob
Bạn đề cập đến việc bạn đã cố gắng thực hiện điều đó trong AST. Điều đó có nghĩa là bạn chỉ muốn các thuộc tính được định nghĩa ngay trên lớp chứ không phải trên các lớp siêu lớp của nó? Tôi nhận ra rằng bạn không muốn những người 'xây dựng' nhưng tôi bối rối về vấn đề này. – aaronasterling