Поиск того, какие методы использует объект Python

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

Или

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

Ответ 1

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

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

Я обнаружил это на diveintopython.net (теперь в архиве). Надеюсь, это предоставит некоторые дополнительные детали!

Если вы получили AttributeError, вы можете использовать его вместо:

getattr( нетерпим к абстрактным виртуальным подклассам Python3.6. Этот код выполняет те же действия, что и выше, и игнорирует исключения.

import pandas as pd 
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],  
                  columns=['foo', 'bar', 'baz']) 
def get_methods(object, spacing=20): 
  methodList = [] 
  for method_name in dir(object): 
    try: 
        if callable(getattr(object, method_name)): 
            methodList.append(str(method_name)) 
    except: 
        methodList.append(str(method_name)) 
  processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s) 
  for method in methodList: 
    try: 
        print(str(method.ljust(spacing)) + ' ' + 
              processFunc(str(getattr(object, method).__doc__)[0:90])) 
    except: 
        print(method.ljust(spacing) + ' ' + ' getattr() failed') 


get_methods(df['foo']) 

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

hasattr(object,"method")

Ответ 5

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

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

По моему скромному мнению, встроенная функция 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("")

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

Ответ 6

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

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

help(object.method) 

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

Ahh... REPL.

Ответ 7

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

Ответ 8

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

 [email protected]:~$ 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 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(           

Ответ 9

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

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

Ответ 10

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

%help(object)

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

Например:

help(str)

Ответ 11

Можно создать функцию 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']

Ответ 12

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

Проверка того, что этот метод существует, может выполняться callable(getattr(object, method)), как уже упоминалось там.

Ответ 13

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

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

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

Ответ 14

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

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

Ответ 15

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

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