2009-02-13 11 views
23

Estoy usando Python 2.x y tengo un objeto que estoy convocando desde el éter; la documentación que contiene no es particularmente clara. Me gustaría poder obtener una lista de propiedades para ese objeto y el tipo de cada propiedad.¿Cómo realizo la introspección en un objeto en Python 2.x?

De forma similar, me gustaría obtener una lista de métodos para ese objeto, además de cualquier otra información que pudiera encontrar sobre ese método, como el número de argumentos y sus respectivos tipos.

Tengo la sensación de que simplemente me falta la jerga correcta en mis búsquedas de Google. No es que quiera descarrilar con detalles, pero es Active Directory, así que eso siempre es divertido.

Respuesta

24

Bien ... Su primera parada será un simple directorio (objeto). Esto le mostrará todos los miembros del objeto, tanto campos como métodos. Pruébalo en un shell interactivo de Python y juega un poco.

Por ejemplo:

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

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

Lo intenté dir, pero no vi algunas propiedades que sé que están disponibles. Es un objeto de Active Directory (ADsNameSpaces, GetObject), y esperaba ver si los diversos atributos como "sn", "cn", etc. estaban en la lista, pero no lo son. Quizás he seleccionado el objeto equivocado para esto. –

9

¿Qué tal algo como:

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

Un método más estructurado será utilizar el inspect module:

La inspeccionar módulo proporciona varias funciones útiles para ayudar a obtener información acerca de objetos en vivo, como módulos, clases, métodos, funciones, tracebacks, marco objec ts y objetos de código. Por ejemplo, puede ayudarlo a examinar el contenido de una clase, recuperar el código fuente de un método, extraer y formatear la lista de argumentos para una función u obtener toda la información que necesita para mostrar un rastreo detallado.

+0

Eso es bastante desagradable con respecto a las cosas getattribute. Es mucho mejor usar getattr() incorporado. –

+1

siéntase libre de reemplazar o .__ getattribute __ (a) con getattr (o, a) – gimel

3

Puede echar un vistazo a inspect module. Proporciona una amplia variedad de herramientas para la inspección de objetos en vivo, así como el código fuente.

0

Si está utilizando win32com.client.Dispatch, inspeccionar el objeto de Python puede no ser de mucha ayuda, ya que es un contenedor genérico para IDispatch.

Puede usar makepy (que viene con Activestate Python) para generar un contenedor de Python desde la biblioteca de tipos. Luego puede mirar el código del envoltorio.

Cuestiones relacionadas