Обнаружение, какие методы у объекта Python есть

StackOverflow https://stackoverflow.com/questions/34439

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Или,

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

Это было полезно?

Решение

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

object_methods = [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")

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

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

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

Dir (...)

dir([object]) -> list of strings

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

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

Если объект поставляет метод с именем __dir__, это будет использоваться; В противном случае используется логика 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("")

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

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

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

help(object.method) 

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

Ах... Реплика.

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

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

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, цинтона без директивы «связывания»).

Open Bash Shell (Ctrl+Alt+T на Ubuntu). Начните оболочку Python3 в нем. Создать объект, чтобы соблюдать методы. Просто добавьте точку после него и нажмите дважды «вкладка», и вы увидите что -то подобное:

 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(           

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

В 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() командование

%help(object)

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

Например:

help(str)

Можно создать 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")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top