Как получить список методов в классе Python?



Я хочу перебирать методы в классе или обрабатывать объекты класса или экземпляра по-разному на основе существующих методов. Как получить список методов класса?



Смотрите также:





  • Как можно получить список методов в
    Модуль Python 2.5?


  • Перебирая
    объект Python / IronPython
    Методы


  • Найти методы
    объект имеет


  • Как мне заглянуть внутрь
    объект Python?


  • Как Мне Это Сделать
    Выполнять Самоанализ на объекте в
    Python 2.x?


  • Как получить
    полный список методов объекта и
    атрибуты?

  • выяснить, какие
    функции доступны из класса
    экземпляр в python?

683   9  

9 ответов:

пример (перечисление методов optparse.OptionParser класс):

>>> from optparse import OptionParser
>>> import inspect
>>> inspect.getmembers(OptionParser, predicate=inspect.ismethod)
[([('__init__', <unbound method OptionParser.__init__>),
...
 ('add_option', <unbound method OptionParser.add_option>),
 ('add_option_group', <unbound method OptionParser.add_option_group>),
 ('add_options', <unbound method OptionParser.add_options>),
 ('check_values', <unbound method OptionParser.check_values>),
 ('destroy', <unbound method OptionParser.destroy>),
 ('disable_interspersed_args',
  <unbound method OptionParser.disable_interspersed_args>),
 ('enable_interspersed_args',
  <unbound method OptionParser.enable_interspersed_args>),
 ('error', <unbound method OptionParser.error>),
 ('exit', <unbound method OptionParser.exit>),
 ('expand_prog_name', <unbound method OptionParser.expand_prog_name>),
 ...
 ]

обратите внимание, что getmembers возвращает список из 2-кортежей. Первый элемент-это имя члена, второй элемент-это значение.

вы также можете передать экземпляр для getmembers:

>>> parser = OptionParser()
>>> inspect.getmembers(parser, predicate=inspect.ismethod)
...

есть dir(theobject) метод для перечисления всех полей и методов вашего объекта (как кортеж) и модуль inspect (как запись codeape) для перечисления полей и методов с их doc (в """).

поскольку все (даже поля) могут быть вызваны в Python, я не уверен, что есть встроенная функция для перечисления только методов. Вы можете попробовать, если объект вы получите через dir и вызвать или нет.

Python 3.х ответить без внешних библиотек

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func))]

dunder-исключенный результат:

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func)) and not func.startswith("__")]

попробовать __dict__.

вы также можете импортировать FunctionType из типов и проверить его с помощью class.__dict__:

from types import FunctionType

class Foo:
    def bar(self): pass
    def baz(self): pass

def methods(cls):
    return [x for x, y in cls.__dict__.items() if type(y) == FunctionType]

methods(Foo)  # ['bar', 'baz']

обратите внимание, что вы должны рассмотреть, хотите ли вы методы из базовых классов, которые наследуются (но не отменяется) включены в результат. Элемент dir() и inspect.getmembers() операции включают методы базового класса, но использование нет.

def find_defining_class(obj, meth_name):
    for ty in type(obj).mro():
        if meth_name in ty.__dict__:
            return ty

Так

print find_defining_class(car, 'speedometer') 

подумайте Python page 210

если ваш метод является "регулярным" методом, а не statimethod,classmethod etc.
Есть небольшой хак, который я придумал -

for k, v in your_class.__dict__.items(): if "function" in str(v): print(k)

это может быть распространено на другие типы методов путем изменения "функции" в if соответственно условие.
Протестировано на python 2.7.

Я знаю, что это старый пост, но просто написал эту функцию и оставит ее здесь, Если кто-то спотыкается, ища ответ:

def classMethods(the_class,class_only=False,instance_only=False,exclude_internal=True):

    def acceptMethod(tup):
        #internal function that analyzes the tuples returned by getmembers tup[1] is the 
        #actual member object
        is_method = inspect.ismethod(tup[1])
        if is_method:
            bound_to = tup[1].im_self
            internal = tup[1].im_func.func_name[:2] == '__' and tup[1].im_func.func_name[-2:] == '__'
            if internal and exclude_internal:
                include = False
            else:
                include = (bound_to == the_class and not instance_only) or (bound_to == None and not class_only)
        else:
            include = False
        return include
    #uses filter to return results according to internal function and arguments
    return filter(acceptMethod,inspect.getmembers(the_class))

Comments

    Ничего не найдено.