Поиск того, какие методы имеет объект Python
учитывая объект Python любого вида, есть ли простой способ получить список всех методов, которые этот объект имеет?
или
Если это невозможно, есть ли по крайней мере простой способ проверить, имеет ли он определенный метод, кроме простой проверки, возникает ли ошибка при вызове метода?
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)
. Он будет отображать все методы, доступные для этого объекта. Классный трюк.
Я считаю, что то, что вы хотите, что-то вроде этого:
список атрибутов из объекта
по моему скромному мнению, встроенную функцию
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']