2009-02-13 5 views
23

Ich benutze Python 2.x und ich habe ein Objekt, das ich vom Äther beschwöre; Die Dokumentation darüber ist nicht besonders klar. Ich möchte in der Lage sein, eine Liste von Eigenschaften für dieses Objekt und den Typ jeder Eigenschaft zu erhalten.Wie führe ich eine Introspektion für ein Objekt in Python 2.x durch?

In ähnlicher Weise möchte ich auch eine Liste von Methoden für dieses Objekt sowie weitere Informationen, die ich über diese Methode finden konnte, wie die Anzahl der Argumente und ihre jeweiligen Typen.

Ich habe das Gefühl, dass ich einfach den richtigen Jargon in meinen Google-Suchen vermisse. Nicht, dass ich mit Details aus dem Konzept gehen möchte, aber es ist Active Directory, das macht immer Spaß.

Antwort

24

Nun ... Ihr erster Halt wird ein einfaches Verzeichnis (Objekt) sein. Dies zeigt Ihnen alle Mitglieder des Objekts, sowohl Felder als auch Methoden. Probieren Sie es in einer interaktiven Python-Shell aus und spielen Sie ein wenig herum.

Zum Beispiel:

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

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

Ich habe versucht dir, aber ich habe nicht einige Eigenschaften, die ich weiß, sind verfügbar. Es ist ein Active Directory-Objekt (ADsNameSpaces, GetObject), und ich hatte gehofft zu sehen, ob die verschiedenen Attribute wie "sn", "cn" usw. in der Liste waren, aber sie sind es nicht. Vielleicht habe ich das falsche Objekt dafür ausgewählt. –

9

Wie wäre es so etwas wie:

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

Eine strukturierte Methode wird die inspect module zu benutzen:

Das inspizieren Modul mehrere nützliche Funktionen zur Verfügung stellt um Informationen über Live-Objekte wie Module, Klassen, Methoden, Funktionen, Trace-Backs, Frame-Objekte zu erhalten ts und Code-Objekte. So können Sie beispielsweise den Inhalt einer Klasse untersuchen, den Quellcode einer Methode abrufen, die Argumentliste für eine Funktion extrahieren und formatieren oder alle Informationen abrufen, die für die Anzeige einer detaillierten Rückverfolgung erforderlich sind.

+0

Das ist in Bezug auf das getattribute-Zeug ziemlich eklig. Es ist viel besser, das eingebaute getattr() zu verwenden. –

+1

Fühlen Sie sich frei zu ersetzen o .__ getattribute __ (a) mit getattr (o, a) – gimel

3

Sie können sich die inspect module ansehen. Es bietet eine Vielzahl von Werkzeugen zur Überprüfung von Live-Objekten sowie Quellcode.

0

Wenn Sie win32com.client.Dispatch verwenden, ist die Überprüfung des Python-Objekts möglicherweise keine große Hilfe, da es sich um einen generischen Wrapper für IDispatch handelt.

Sie können makepy (das mit Activestate Python kommt) verwenden, um einen Python-Wrapper aus der Typbibliothek zu generieren. Dann können Sie sich den Code für den Wrapper ansehen.