Нахождение каких методов у объекта Python - PullRequest
341 голосов
/ 29 августа 2008

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

Или,

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

Ответы [ 15 ]

427 голосов
/ 29 августа 2008

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

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

Я обнаружил это на этом сайте . Надеюсь, это предоставит дополнительную информацию!

185 голосов
/ 29 августа 2008

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

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

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

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

63 голосов
/ 20 ноября 2013

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

30 голосов
/ 29 августа 2008

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

hasattr(object,"method")
27 голосов
/ 26 мая 2016

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

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

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

реж (...)

dir([object]) -> list of strings

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

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

Если объект предоставляет метод с именем __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("")

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

24 голосов
/ 29 августа 2008

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

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

help(object.method) 

чтобы увидеть pydocs, подпись метода и т. Д.

Ааа ... REPL .

12 голосов
/ 29 января 2015

Если вы конкретно хотите методы , вам следует использовать inspect.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").

10 голосов
/ 15 ноября 2017

Открыть оболочку bash (Ctrl + Alt + T в Ubuntu). Запустите в нем оболочку python3. Создать объект для наблюдения за методами. Просто добавьте точку после нее и дважды нажмите «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
 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(           
7 голосов
/ 09 декабря 2014

Проблема всех методов, указанных здесь, заключается в том, что вы НЕ МОЖЕТЕ быть уверены, что метод не существует.

В 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.

6 голосов
/ 26 апреля 2018

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

%help(object)

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

Например:

help(str)
...