Как получить список методов в классе Python?
Я хочу перебирать методы в классе или обрабатывать объекты класса или экземпляра по-разному на основе существующих методов. Как получить список методов класса?
Смотрите также:
Как можно получить список методов в
Модуль Python 2.5?
Перебирая
объект Python / IronPython
Методы
Найти методы
объект имеет
Как мне заглянуть внутрь
объект Python?
Как Мне Это Сделать
Выполнять Самоанализ на объекте в
Python 2.x?
Как получить
полный список методов объекта и
атрибуты?- выяснить, какие
функции доступны из класса
экземпляр в python?
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("__")]
вы также можете импортировать 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,classmethodetc.
Есть небольшой хак, который я придумал -
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