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

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

Также смотрите:

Ответ 1

Пример (перечисление методов класса 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)
...

Ответ 2

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

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

Ответ 3

Ответ 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("__")]

Ответ 4

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

Ответ 5

вы также можете импортировать 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']

Ответ 6

Предположим, вы хотите знать все методы, связанные со списком класса Just Type.

 print (dir(list))

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

Ответ 7

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

Ответ 8

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

Think Python page 210

Ответ 9

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

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.

Ответ 10

methods = [(func, getattr(o, func)) for func in dir(o) if callable(getattr(o, func))]

дает идентичный список как

methods = inspect.getmembers(o, predicate=inspect.ismethod)

делает.

Ответ 11

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

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

Ответ 12

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

import numpy as np
print(np.random.__all__)

Ответ 13

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

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

Это можно распространить на методы другого типа, изменив "функцию" в if соответственно.
Проверено на python 2.7.

Ответ 14

class CPerson:
    def __init__(self, age):
        self._age = age

    def run(self):
        pass

    @property
    def age(self): return self._age

    @staticmethod
    def my_static_method(): print("Life is short, you need Python")

    @classmethod
    def say(cls, msg): return msg


test_class = CPerson
# print(dir(test_class))  # list all the fields and methods of your object
print([(name, t) for name, t in test_class.__dict__.items() if type(t).__name__ == 'function' and not name.startswith('__')])
print([(name, t) for name, t in test_class.__dict__.items() if type(t).__name__ != 'function' and not name.startswith('__')])

выход

[('run', <function CPerson.run at 0x0000000002AD3268>)]
[('age', <property object at 0x0000000002368688>), ('my_static_method', <staticmethod object at 0x0000000002ACBD68>), ('say', <classmethod object at 0x0000000002ACF0B8>)]