Поиск того, какие методы имеет объект Python


учитывая объект Python любого вида, есть ли простой способ получить список всех методов, которые этот объект имеет?

или

Если это невозможно, есть ли по крайней мере простой способ проверить, имеет ли он определенный метод, кроме простой проверки, возникает ли ошибка при вызове метода?

15 286

15 ответов:

похоже, вы можете использовать этот код, заменив "объект" на объект, который вас интересует: -

[method_name for method_name in dir(object)
 if callable(getattr(object, method_name))]

Я обнаружил его в этот сайт, надеюсь, что это должно обеспечить некоторые дополнительные детали!

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

>>> import moduleName
>>> dir(moduleName)

кроме того, вы можете использовать hasattr(module_name, "attr_name") функция, чтобы узнать, если модуль имеет определенный атрибут.

посмотреть руководство по интроспекции на Python для получения дополнительной информации.

самый простой способ-это использовать dir(objectname). Он будет отображать все методы, доступные для этого объекта. Классный трюк.

чтобы проверить, если он имеет определенный метод:

hasattr(object,"method")

помимо более прямых ответов, я был бы упущен, если бы не упомянул iPython. Нажмите "tab", чтобы увидеть доступные методы, с автозаполнением.

и как только вы нашли способ, попробуйте:

help(object.method) 

чтобы увидеть pydocs, сигнатуру метода и т. д.

Аааа... REPL.

Я считаю, что то, что вы хотите, что-то вроде этого:

список атрибутов из объекта

по моему скромному мнению, встроенную функцию dir() могу сделать эту работу за вас. Взято из help(dir) вывод на вашей оболочке Python:

реж(...)

dir([object]) -> list of strings

если вызывается без аргументов, она возвращает имена в текущей области.

Else, возвращает алфавитный список имен, содержащий (некоторые из) атрибутов данного объекта и атрибутов, доступных из него.

если объект предоставляет метод с именем __dir__, он будет использоваться; в противном случае логика dir() по умолчанию используется и возвращает:

  • для объекта модуля: атрибуты модуля.
  • для объекта класса: его атрибуты и рекурсивно атрибуты его баз.
  • для любого другого объекта: его атрибуты, атрибуты его класса и рекурсивно атрибуты базовых классов своего класса.

например:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> a = "I am a string"
>>>
>>> type(a)
<class 'str'>
>>>
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']

как я проверял ваш вопрос, я решил продемонстрировать свой ход мысли, с лучшим форматированием вывода dir().

dir_attributes.py (Python 2.7.6)

#!/usr/bin/python
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print "\nObject Data: %s" % obj
print "Object Type: %s\n" % type(obj)

for method in dir(obj):
    # the comma at the end of the print, makes it printing 
    # in the same line, 4 times (count)
    print "| {0: <20}".format(method),
    count += 1
    if count == 4:
        count = 0
        print

dir_attributes.py (Python 3.4.3)

#!/usr/bin/python3
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print("\nObject Data: ", obj)
print("Object Type: ", type(obj),"\n")

for method in dir(obj):
    # the end=" " at the end of the print statement, 
    # makes it printing in the same line, 4 times (count)
    print("|    {:20}".format(method), end=" ")
    count += 1
    if count == 4:
        count = 0
        print("")

надеюсь, что я внес свой вклад :).

Если вы специально хотите методы, вы должны использовать проверка.ismethod.

для названия метода:

import inspect
method_names = [attr for attr in dir(self) if inspect.ismethod(getattr(self, attr))]

для методов:

import inspect
methods = [member for member in [getattr(self, attr) for attr in dir(self)] if inspect.ismethod(member)]

иногда inspect.isroutine также может быть полезен (для встроенных модулей, расширений C, Cython без директивы компилятора "binding").

проблема со всеми методами, указанными здесь, заключается в том, что вы не можете быть уверены, что метод не существует.

в Python вы можете перехватить точку вызова через __getattr__ и __getattribute__, что позволило создать метод "во время выполнения"

Exemple:

class MoreMethod(object):
    def some_method(self, x):
        return x
    def __getattr__(self, *args):
        return lambda x: x*2

при его выполнении можно вызвать метод, не существующий в словаре объектов...

>>> o = MoreMethod()
>>> o.some_method(5)
5
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method']
>>> o.i_dont_care_of_the_name(5)
10

и именно поэтому вы используете легче просить прощения, чем разрешения парадигмы в Python.

самый простой способ получить список методов любого объекта-использовать .

%help(object)

в нем будут перечислены все доступные / важные методы, связанные с этим объектом.

например:

help(str)

открыть оболочку bash (ctrl+alt+T на Ubuntu). Начать питон3 скорлупу. Создайте объект для наблюдения методов. Просто добавьте точку после него и нажмите дважды "tab", и вы увидите что-то вроде этого:

 user@note:~$ python3
 Python 3.4.3 (default, Nov 17 2016, 01:08:31) 
 [GCC 4.8.4] on linux
 Type "help", "copyright", "credits" or "license" for more information.
 >>> import readline
 >>> readline.parse_and_bind("tab: complete")
 >>> s = "Any object. Now it's a string"
 >>> s. # here tab should be pressed twice times
 s.__add__(           s.__rmod__(          s.istitle(
 s.__class__(         s.__rmul__(          s.isupper(
 s.__contains__(      s.__setattr__(       s.join(
 s.__delattr__(       s.__sizeof__(        s.ljust(
 s.__dir__(           s.__str__(           s.lower(
 s.__doc__            s.__subclasshook__(  s.lstrip(
 s.__eq__(            s.capitalize(        s.maketrans(
 s.__format__(        s.casefold(          s.partition(
 s.__ge__(            s.center(            s.replace(
 s.__getattribute__(  s.count(             s.rfind(
 s.__getitem__(       s.encode(            s.rindex(
 s.__getnewargs__(    s.endswith(          s.rjust(
 s.__gt__(            s.expandtabs(        s.rpartition(
 s.__hash__(          s.find(              s.rsplit(
 s.__init__(          s.format(            s.rstrip(
 s.__iter__(          s.format_map(        s.split(
 s.__le__(            s.index(             s.splitlines(
 s.__len__(           s.isalnum(           s.startswith(
 s.__lt__(            s.isalpha(           s.strip(
 s.__mod__(           s.isdecimal(         s.swapcase(
 s.__mul__(           s.isdigit(           s.title(
 s.__ne__(            s.isidentifier(      s.translate(
 s.__new__(           s.islower(           s.upper(
 s.__reduce__(        s.isnumeric(         s.zfill(
 s.__reduce_ex__(     s.isprintable(       
 s.__repr__(          s.isspace(           

можно создать getAttrs функция, которая возвращает вызываемые имена свойств объекта

def getAttrs(object):
  return filter(lambda m: callable(getattr(object, m)), dir(object))

print getAttrs('Foo bar'.split(' '))

что бы вернуть

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
 '__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__', 
 '__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__', 
 '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', 
 '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', 
 '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', 
 '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 
 'remove', 'reverse', 'sort']

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

проверка того, что метод существует может быть сделано с помощью callable(getattr(object, method)) Как уже было сказано там.

...есть ли по крайней мере простой способ проверить, имеет ли он определенный метод, кроме простой проверки, возникает ли ошибка при вызове метода

а "легче просить прощения, чем разрешения " это, конечно, Питонический путь, то, что вы ищете, может быть:

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'

возьмите список в качестве объекта

obj = []

list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))

вы получаете:

['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

для поиска определенного метода в целом модуле

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")