2009-06-05 8 views
2

Comment déterminer dynamiquement quelles fonctions ont été définies à partir d'une instance d'une classe?Découvrir quelles fonctions sont disponibles depuis une instance de classe en python?

Par exemple:

class A(object): 
    def methodA(self, intA=1): 
     pass 

    def methodB(self, strB): 
     pass 

a = A() 

Idéalement, je veux savoir que l'instance 'a' a methodA et methodB, et quels arguments ils prennent?

+0

Voir http://stackoverflow.com/questions/546337/how-do-i-perform-introspection-on-an-object-in-python-2-x –

Répondre

12

Regardez le module inspect.

>>> import inspect 
>>> inspect.getmembers(a) 
[('__class__', <class '__main__.A'>), 
('__delattr__', <method-wrapper '__delattr__' of A object at 0xb77d48ac>), 
('__dict__', {}), 
('__doc__', None), 
('__getattribute__', 
    <method-wrapper '__getattribute__' of A object at 0xb77d48ac>), 
('__hash__', <method-wrapper '__hash__' of A object at 0xb77d48ac>), 
('__init__', <method-wrapper '__init__' of A object at 0xb77d48ac>), 
('__module__', '__main__'), 
('__new__', <built-in method __new__ of type object at 0x8146220>), 
('__reduce__', <built-in method __reduce__ of A object at 0xb77d48ac>), 
('__reduce_ex__', <built-in method __reduce_ex__ of A object at 0xb77d48ac>), 
('__repr__', <method-wrapper '__repr__' of A object at 0xb77d48ac>), 
('__setattr__', <method-wrapper '__setattr__' of A object at 0xb77d48ac>), 
('__str__', <method-wrapper '__str__' of A object at 0xb77d48ac>), 
('__weakref__', None), 
('methodA', <bound method A.methodA of <__main__.A object at 0xb77d48ac>>), 
('methodB', <bound method A.methodB of <__main__.A object at 0xb77d48ac>>)] 
>>> inspect.getargspec(a.methodA) 
(['self', 'intA'], None, None, (1,)) 
>>> inspect.getargspec(getattr(a, 'methodA')) 
(['self', 'intA'], None, None, (1,)) 
>>> print inspect.getargspec.__doc__ 
Get the names and default values of a function's arguments. 

    A tuple of four things is returned: (args, varargs, varkw, defaults). 
    'args' is a list of the argument names (it may contain nested lists). 
    'varargs' and 'varkw' are the names of the * and ** arguments or None. 
    'defaults' is an n-tuple of the default values of the last n arguments. 
>>> print inspect.getmembers.__doc__ 
Return all members of an object as (name, value) pairs sorted by name. 
    Optionally, only return members that satisfy a given predicate. 
+0

est-il une différence entre l'inspection. getmembers() et dir() –

+0

@Adrian: dir() retourne juste les noms. inspect.getmembers() renvoie également les membres réels. – RichieHindle

+0

Notez que certaines migth de classe ont des méthodes dynamiques qui ne peuvent pas être inspectées - la meilleure source d'information reste la documentation. – nosklo

Questions connexes