Boucle sur une méthode D'objet Python / IronPython
Quelle est la bonne façon de boucler les méthodes D'un objet Python et de les appeler?
vu l'objet:
class SomeTest():
def something1(self):
print "something 1"
def something2(self):
print "something 2"
4 réponses
vous pouvez utiliser le module inspecter pour obtenir des membres de classe (ou d'instance):
>>> class C(object):
... a = 'blah'
... def b(self):
... pass
...
...
>>> c = C()
>>> inspect.getmembers(c, inspect.ismethod)
[('b', <bound method C.b of <__main__.C object at 0x100498250>>)]
getmembers() retourne une liste de tuples, où chaque tuple est (Nom, Membre). Le second argument pour getmembers() est le prédicat, qui filtre la liste de retour (dans ce cas, en retournant seulement les objets method)
Méthodes vs fonctions et d'autres types de callables...
(Pour traiter de la question dans les commentaires dans l'Inconnu.)
tout d'Abord, il convient de noter que, en plus des méthodes définies par l'utilisateur, il existe des méthodes intégrées, et une méthode intégrée est, comme le doc à http://docs.python.org/reference/datamodel.html dit, "vraiment un autre déguisement d'une fonction intégrée" (qui est un wrapper autour d'une fonction C.)
comme pour les méthodes définies par l'utilisateur, comme la citation Citée De Unknown dit:
un objet de méthode défini par l'utilisateur combine une classe, une instance de classe (ou d'Aucun) et tout objet appelable (normalement un fonction définie par l'utilisateur).
mais cela ne signifie pas que "tout ce qui définit __call__
et est attaché à un objet est une méthode."Une méthode est un appelable, mais un appelable n'est pas nécessairement une méthode. Les méthodes définies par l'utilisateur sont des enveloppements autour de ce que dit la citation.
espérons que cette sortie (de Python 2.5.2 que j'AI sous la main) montrera la distinction:
IDLE 1.2.2
>>> class A(object):
x = 7
>>> A # show the class object
<class '__main__.A'>
>>> a = A()
>>> a # show the instance
<__main__.A object at 0x021AFBF0>
>>> def test_func(self):
print self.x
>>> type(test_func) # what type is it?
<type 'function'>
>>> dir(test_func) # what does it have?
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__',
'__getattribute__', '__hash__', '__init__', '__module__', '__name__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict',
'func_doc', 'func_globals', 'func_name']
>>> # But now let's put test_func on the class...
>>> A.test = test_func
>>> type(A.test) # What type does this show?
<type 'instancemethod'>
>>> dir(A.test) # And what does it have?
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__get__',
'__getattribute__', '__hash__', '__init__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__str__', 'im_class',
'im_func', 'im_self']
>>> # See, we just got a wrapper, and the function is in 'im_func'...
>>> getattr(A.test, 'im_func')
<function test_func at 0x0219F4B0>
>>> # Now to show bound vs. unbound methods...
>>> getattr(a.test, 'im_self') # Accessing it via the instance
<__main__.A object at 0x021AFBF0>
>>> # The instance is itself 'im_self'
>>> a.test()
7
>>> getattr(A.test, 'im_self') # Accessing it via the class returns None...
>>> print getattr(A.test, 'im_self')
None
>>> # It's unbound when accessed that way, so there's no instance in there
>>> # Which is why the following fails...
>>> A.test()
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
A.test()
TypeError: unbound method test_func() must be called with A instance as
first argument (got nothing instead)
>>>
et-édition pour ajouter la sortie supplémentaire suivante, qui est également pertinente...
>>> class B(object):
pass
>>> b = B()
>>> b.test = test_func # Putting the function on the instance, not class
>>> type(b.test)
<type 'function'>
>>>
Je n'ajouterai pas plus de sortie, mais vous pourriez aussi faire d'une classe un attribut d'une autre classe ou d'une autre instance, et, même si les classes sont appelables, vous n'obtiendriez pas méthode. Les méthodes sont mises en œuvre à l'aide de descripteurs autres que des données, alors cherchez des descripteurs si vous voulez plus d'information sur leur fonctionnement.
cet extrait de code appellera tout ce qu'il trouvera dans obj
et stockera les résultats dans la cartographie, où la clé est le nom d'attribut - dict((k, v()) for (k, v) in obj.__dict__.iteritems() if k.startswith('something'))
Modifier
Daniel, tu te trompes.
http://docs.python.org/reference/datamodel.html
méthodes définies par l'utilisateur
un méthode objet combine une classe, une instance de classe (ou Aucun) et tout objet appelant (normalement une fonction définie par l'utilisateur).
par conséquent, tout ce qui définit __call__ et est attaché à un objet est une méthode.
réponse
La bonne façon de voir quels sont les éléments d'un objet est d'utiliser la fonction dir ().
évidemment cet exemple ne fonctionne que pour les fonctions qui ne prennent pas d'arguments.
a=SomeTest()
for varname in dir(a):
var = getattr(a, varname)
if hasattr(var, "__call__"):
var()