Вопрос

Каков правильный способ перебирать методы объекта Python и вызывать их?

Учитывая объект:

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

Нет правильного решения

Другие советы

Вы можете использовать модуль inspect для получения членов класса (или экземпляра):

>>> 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() возвращает список кортежей, где каждый кортеж равен (имя, член).Вторым аргументом getmembers() является предикат, который фильтрует возвращаемый список (в данном случае возвращающий только объекты метода).

Методы противфункции и другие типы вызываемых объектов...

(Чтобы решить проблему в комментариях к сообщению Неизвестного.)

Во-первых, следует отметить, что, в дополнение к определяемым пользователем методам, существуют встроенные методы, и встроенный метод, как указано в документе на http://docs.python.org/reference/datamodel.html говорит: "на самом деле это другая маскировка встроенной функции" (которая является оболочкой вокруг функции C.)

Что касается пользовательских методов, то, как говорится в приведенной цитате Неизвестного:

Определяемый пользователем объект метода объединяет класс, экземпляр класса (или ни одного) и любой вызываемый объект (обычно определяемую пользователем функцию).

Но это не означает, что "все, что определяет __call__ и присоединяется к объекту как метод ". Метод является вызываемым, но вызываемый объект не обязательно является методом.Пользовательские методы - это обертки вокруг того, что говорится в цитате.

Надеюсь, этот вывод (из Python 2.5.2, который у меня есть под рукой) покажет различие:

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

И - редактирование для добавления следующих дополнительных выходных данных, которые также актуальны...

>>> class B(object):
    pass

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

Я не буду добавлять дополнительные выходные данные, но вы также можете сделать класс атрибутом другого класса или экземпляра, и, хотя классы можно вызывать, вы не получите метод.Методы реализованы с использованием дескрипторов, не связанных с данными, поэтому поищите дескрипторы, если вам нужна дополнительная информация о том, как они работают.

Этот фрагмент кода вызовет все, что он найдет в obj и сохраняйте результаты в mapping, где key - это имя атрибута — dict((k, v()) for (k, v) in obj.__dict__.iteritems() if k.startswith('something'))

Редактировать

Дэниел, ты ошибаешься.

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

Пользовательские методы

Определенный пользователем способ объект объединяет класс, экземпляр класса (или Нет) и любой вызываемый объект (обычно это определяемая пользователем функция).

Следовательно, все, что определяет __call__ и присоединено к объекту, является методом.

Ответ

Правильный способ увидеть, какие элементы есть у объекта, - это использовать функцию dir().

Очевидно, что этот пример работает только для функций, которые не принимают аргументов.

a=SomeTest()
for varname in dir(a):
    var = getattr(a, varname)
    if hasattr(var, "__call__"):
        var()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top