2009-02-13 14 views
23

Tôi đang sử dụng Python 2.x và tôi có một đối tượng mà tôi đang triệu hồi từ aether; tài liệu về nó không rõ ràng. Tôi muốn có thể nhận được một danh sách các thuộc tính cho đối tượng đó và loại của mỗi thuộc tính.Làm cách nào để thực hiện Introspection trên một đối tượng trong Python 2.x?

Tương tự, tôi cũng muốn có danh sách các phương thức cho đối tượng đó, cùng với bất kỳ thông tin nào khác tôi có thể tìm thấy trên phương pháp đó, chẳng hạn như số lượng đối số và loại tương ứng.

Tôi có cảm giác rằng tôi chỉ đơn giản là thiếu biệt ngữ chính xác trong các tìm kiếm trên Google của mình. Không phải là tôi muốn làm hỏng với các chi tiết cụ thể, nhưng đó là Active Directory, vì vậy đó luôn là niềm vui.

Trả lời

24

Vâng ... Điểm dừng đầu tiên của bạn sẽ là một thư mục đơn giản (đối tượng). Điều này sẽ cho bạn thấy tất cả các thành viên của đối tượng, cả hai lĩnh vực và phương pháp. Hãy thử nó trong một vỏ Python tương tác, và chơi xung quanh một chút.

Ví dụ:

> class Foo: 
    def __init__(self): 
    self.a = "bar" 
    self.b = 4711 

> a=Foo() 
> dir(a) 
['__doc__', '__init__', '__module__', 'a', 'b'] 
+0

Tôi đã thử thư mục, nhưng tôi không thấy một số thuộc tính mà tôi biết có sẵn. Đó là một đối tượng Active Directory (ADsNameSpaces, GetObject), và tôi đã hy vọng để xem nếu các thuộc tính khác nhau như "sn", "cn", và vv trong danh sách, nhưng họ không. Có lẽ tôi đã chọn đối tượng sai cho điều này. –

9

Làm thế nào về một cái gì đó như:

>>> o=object() 
>>> [(a,type(o.__getattribute__(a))) for a in dir(o)] 
[('__class__', <type 'type'>), ('__delattr__', <type 'method-wrapper'>), 
('__doc__', <type 'str'>), ('__format__', <type 'builtin_function_or_method'>), 
('__getattribute__', <type 'method-wrapper'>), ('__hash__', <type 'method-wrapper'>), 
('__init__', <type 'method-wrapper'>), 
('__new__', <type 'builtin_function_or_method'>), 
('__reduce__', <type 'builtin_function_or_method'>), 
('__reduce_ex__', <type 'builtin_function_or_method'>), 
('__repr__', <type 'method-wrapper'>), ('__setattr__', <type 'method-wrapper'>), 
('__sizeof__', <type 'builtin_function_or_method'>), 
('__str__', <type 'method-wrapper'>), 
('__subclasshook__', <type 'builtin_function_or_method'>)] 
>>> 

Một phương pháp có cấu trúc hơn sẽ sử dụng inspect module:

Các kiểm tra mô-đun cung cấp một số chức năng hữu ích để nhận thông tin về các đối tượng trực tiếp như mô-đun, lớp học, phương pháp, chức năng, tracebacks, khung objec ts và các đối tượng mã. Ví dụ, nó có thể giúp bạn kiểm tra nội dung của một lớp, lấy mã nguồn của một phương thức, trích xuất và định dạng danh sách đối số cho một hàm hoặc nhận tất cả thông tin bạn cần để hiển thị một truy xuất chi tiết.

+0

Đó là khá khó chịu liên quan đến các công cụ getattribute. Tốt hơn hết là sử dụng getattr() được tích hợp sẵn. –

+1

hãy thay thế o .__ getattribute __ (a) bằng getattr (o, a) – gimel

3

Bạn có thể xem qua số inspect module. Nó cung cấp nhiều công cụ để kiểm tra các đối tượng trực tiếp cũng như mã nguồn.

0

Nếu bạn đang sử dụng win32com.client.Dispatch, kiểm tra đối tượng Python có thể không có nhiều trợ giúp vì đó là trình bao bọc chung cho IDispatch.

Bạn có thể sử dụng makepy (đi kèm với Activestate Python) để tạo trình bao bọc Python từ thư viện kiểu. Sau đó, bạn có thể xem mã cho trình bao bọc.