Pregunta

¿Cuál es la forma correcta de recorrer los métodos de un objeto Python y llamarlos?

Dado el objeto:

class SomeTest():
  def something1(self):
    print "something 1"
  def something2(self):
    print "something 2"

No hay solución correcta

Otros consejos

Puede utilizar el módulo de inspección de conseguir miembros de la clase (o instancia):

>>> 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 () devuelve una lista de tuplas, donde cada tupla es (nombre, miembro). El segundo argumento de GetMembers () es el predicado, que filtra la lista de retorno (en este caso, volviendo sólo los objetos de método)

Métodos vs. funciones y otros tipos de callables ...

(Para abordar la cuestión en los comentarios en el post de Desconocido.)

En primer lugar, cabe señalar que, además de los métodos definidos por el usuario, hay métodos incorporados, y un método integrado es, como el doc a http://docs.python.org/reference/datamodel.html dice, "realmente un disfraz diferente de una función incorporada"( que es una envoltura alrededor de una función C).

En cuanto a los métodos definidos por el usuario, como dice cotización citado de Desconocido:

  

A definidos por el usuario cosechadoras método objeto   una clase, una instancia de clase (o ninguno)   y cualquier objeto invocable (normalmente una   Definido por el usuario función).

Sin embargo, esto no significa que "cualquier cosa que define __call__ y está asociado a un objeto es un método." Un método es una exigible, pero una exigible no es necesariamente un método. métodos definidos por el usuario son las envolturas alrededor de lo que dice la cita.

Con suerte esta salida (de Python 2.5.2, que tengo a mano) mostrará la distinción:

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

Y - edición para agregar la siguiente salida adicional, que también es relevante ...

>>> class B(object):
    pass

>>> b = B()
>>> b.test = test_func  # Putting the function on the instance, not class
>>> type(b.test)
<type 'function'>
>>> 

No voy a añadir más producción, pero también se podría hacer una clase de un atributo de otra clase o instancia, y, a pesar de que las clases son exigible, que no puedes tener un método. Los métodos se implementan utilizando descriptores no son de datos, a fin de buscar descriptores si desea más información sobre cómo funcionan.

Este fragmento de código llamará a cualquier cosa que se encuentre en obj y almacenar los resultados en la cartografía, donde la clave es el nombre de atributo - dict((k, v()) for (k, v) in obj.__dict__.iteritems() if k.startswith('something'))

Editar

Daniel, estás equivocado.

http://docs.python.org/reference/datamodel.html

Métodos definidos por el usuario

Un definido por el usuario método objeto combina una clase, una instancia de clase (o ninguno) y cualquier objeto invocable (normalmente una función definida por el usuario).

Por lo tanto, cualquier cosa que defina __call__ y esté adjunta a un objeto es un método.

Respuesta

La forma correcta de ver qué elementos tiene un objeto es usar la función dir().

Obviamente este ejemplo sólo funciona para funciones que no aceptan argumentos.

a=SomeTest()
for varname in dir(a):
    var = getattr(a, varname)
    if hasattr(var, "__call__"):
        var()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top