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

Ответы [ 13 ]

278 голосов
/ 16 декабря 2009

Пример (список методов класса 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 возвращает список из двух кортежей. Первый элемент - это имя члена, второй элемент - значение.

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

>>> parser = OptionParser()
>>> inspect.getmembers(parser, predicate=inspect.ismethod)
...
171 голосов
/ 16 декабря 2009

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

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

80 голосов
/ 21 августа 2016

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

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

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

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func)) and not func.startswith("__")]
27 голосов
/ 16 декабря 2009

Попробуйте свойство __dict__.

16 голосов
/ 29 марта 2015

Вы также можете импортировать 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']
12 голосов
/ 04 декабря 2018

Допустим, вы хотите знать все методы, связанные со списком Просто введите следующее

 print (dir(list))

Выше приведены все методы класса списка

12 голосов
/ 20 сентября 2011

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

1 голос
/ 23 января 2019

Это также работает:

mymodule.py

def foo(x)
   return 'foo'
def bar()
   return 'bar'

В другом файле

import inspect
import mymodule
method_list = [ func[0] for func in inspect.getmembers(mymodule, predicate=inspect.isroutine) if callable(getattr(mymodule, func[0])) ]

вывод:

['foo', 'bar']

Из документации по питону:

inspect.isroutine (объект)

Return true if the object is a user-defined or built-in function or method.
1 голос
/ 12 июля 2014
def find_defining_class(obj, meth_name):
    for ty in type(obj).mro():
        if meth_name in ty.__dict__:
            return ty

So

print find_defining_class(car, 'speedometer') 

Подумайте Python страница 210

0 голосов
/ 25 марта 2019

Если вы хотите перечислить только методы класса Python

import numpy as np
print(np.random.__all__)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...