2008-08-29 2 views
233

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

Или

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

+0

Соответствующие: https://stackoverflow.com/q/46033277/1959808 – 2017-09-09 07:39:56

ответ

297

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

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

Я обнаружил его в this site, мы надеемся, что должно обеспечить некоторые дополнительные детали!

+0

Я не уверен, что вы пытаетесь достичь здесь, но имеющие «метод» в этих 3 местах не имеет смысла для меня , Замена «объекта» на «интересующий вас объект» возвращает все вызывающие вызовы для любого объекта с одним вызываемым. Пожалуйста, помогите мне понять суть. – 2013-03-26 14:20:54

+0

Возможно, вы имели в виду `[getattr (obj, method) для метода in dir (obj), если метод == method_name и callable (getattr (obj, method_name))]`, который можно использовать как: 'obj = {' foo ': 'бар'}; method_name = 'получить'; x = [getattr (obj, method) для метода в dir (obj), если метод == method_name и callable (getattr (obj, method_name))]; а затем `if (len (x)): x [0] ('foo')` ... Я знаю, что это действительно противно на одной строке, но комментарии не допускают разрывов строк – 2013-03-26 14:28:04

+0

@RichardBronosky, это может не сделать любой смысл для вас, но он действительно работает. – jwg 2014-09-01 20:42:36

131

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

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

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

Для получения дополнительной информации см. Guide to Python introspection.

23

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

hasattr(object,"method") 
17

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

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

help(object.method) 

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

Ааа ... REPL.

1

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

В то время как «Easier to ask for forgiveness than permission», безусловно, Pythonic образом, что вы ищете, может быть:

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

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

5

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

В 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 

И именно поэтому вы используете Easier to ask for forgiveness than permission парадигм в Python.

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 без "связывания" директивы компилятора).

2

Можно создать 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'] 
2

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

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

15

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

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

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

Надежда, что я способствовал :).

2

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

[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. 
>>> 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(   
0

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^