Pergunta

O que é a maneira correta de loop sobre métodos de um objeto Python e chamá-los?

Dado o objeto:

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

Nenhuma solução correta

Outras dicas

Você pode usar o módulo inspecionar para obter classe (ou instância) membros:

>>> 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 () retorna uma lista de tuplas, onde cada tupla é (nome, membro). O segundo argumento para GetMembers () é o predicado, que filtra a lista de retorno (neste caso, retornando apenas objetos método)

Métodos funções vs. e outros tipos de funções chamáveis ??...

(Para abordar a questão nos comentários no post de desconhecido.)

Primeiro, deve notar-se que, em adição aos métodos definidos pelo utilizador, existem métodos incorporados, e um embutido método é, como o doc a http://docs.python.org/reference/datamodel.html diz, "realmente um disfarce diferente de um built-in função"( que é um invólucro em torno de uma função C.)

Como para os métodos definidos pelo usuário, como citação citada do desconhecido diz:

A combina método de objeto definido pelo usuário uma classe, uma instância da classe (ou nenhum) e qualquer objecto pode ser chamado (normalmente um função definida pelo usuário).

Mas isso não significa que "qualquer coisa que define __call__ e está ligado a um objeto é um método." Um método é uma que pode ser chamado, mas um que pode ser chamado não é necessariamente um método. métodos definidos pelo usuário são invólucros em torno do que a citação diz.

Esperamos que esta saída (de Python 2.5.2 que eu tenho à mão) vai mostrar a distinção:

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

E - edição para adicionar a seguinte saída adicional, que também é relevante ...

>>> class B(object):
    pass

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

Eu não vou acrescentar mais saída, mas você também pode fazer uma classe um atributo de outra classe ou instância, e, apesar de aulas podem ser chamados, você não iria obter um método. Métodos são implementados utilizando descritores não-dados, assim que olhar para cima descritores se você quiser mais informações sobre como eles funcionam.

Este trecho de código irá chamar qualquer coisa que vai encontrar em obj e armazenar resultados no mapeamento, onde chave é nome de atributo - dict((k, v()) for (k, v) in obj.__dict__.iteritems() if k.startswith('something'))

Editar

Daniel, você está errado.

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

métodos definidos pelo usuário

A definido pelo utilizador método objecto combina uma classe, uma instância de classe (ou Nenhum) e (normalmente uma função qualquer objecto que pode ser chamado definido pelo utilizador).

Portanto, qualquer coisa que define __call__ e está ligado a um objecto é um método.

Resposta

A maneira correta de ver o que elementos um objeto tem é usar a função dir ().

Obviamente, este exemplo só funciona para funções que recebem sem argumentos.

a=SomeTest()
for varname in dir(a):
    var = getattr(a, varname)
    if hasattr(var, "__call__"):
        var()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top