How Do I Perform Introspection on an Object in Pyt

2019-01-14 15:44发布

问题:

I'm using Python 2.x and I have an object I'm summoning from the aether; the documentation on it is not particularly clear. I would like to be able to get a list of properties for that object and the type of each property.

Similarly, I'd like to get a list of methods for that object, as well, plus any other information I could find on that method, such as number of arguments and their respective types.

I have a feeling that I am simply missing the correct jargon in my Google searches. Not that I want to derail with specifics, but it's Active Directory, so that's always fun.

回答1:

Well ... Your first stop will be a simple dir(object). This will show you all the object's members, both fields and methods. Try it in an interactive Python shell, and play around a little.

For instance:

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

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


回答2:

How about something like:

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

A more structured method will be to use the inspect module:

The inspect module provides several useful functions to help get information about live objects such as modules, classes, methods, functions, tracebacks, frame objects, and code objects. For example, it can help you examine the contents of a class, retrieve the source code of a method, extract and format the argument list for a function, or get all the information you need to display a detailed traceback.



回答3:

"Guide to Python introspection" is a nice article to get you started.



回答4:

You could have a look at the inspect module. It provides a wide variety of tools for inspection of live objects as well as source code.



回答5:

If you're using win32com.client.Dispatch, inspecting the Python object might not be much help as it's a generic wrapper for IDispatch.

You can use makepy (which comes with Activestate Python) to generate a Python wrapper from the type library. Then you can look at the code for the wrapper.