Как получить список методов в классе 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>)]