сохраните ваши файлы с этой строкой ниже поверх скрипта
hey.py
#! /usr/bin/python
print('Hello, world!')
откройте терминал в этом каталоге
$ python hey.py
, или если вы используете python3, тогда
$ python3 hey.py
Если вы специально хотите использовать методы, вы должны использовать 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 без директивы компилятора привязки).
Проблема со всеми указанными здесь способами заключается в том, что вы НЕ МОЖЕТЕ быть уверены, что метод не существует.
В Python вы можете перехватить точку вызова через __getattr__
и __getattribute__
, что позволяет создать метод «во время выполнения»
Пример:
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, чтобы попросить прощения, чем парадигмы разрешения в Python.
Нет надежного способа перечислить все методы объекта. dir(object)
обычно полезен, но в некоторых случаях он не может перечислить все методы. Согласно dir()
документации : «С аргументом попытайтесь вернуть список допустимых атрибутов для этого объекта.»
Проверка этого метода существует может быть сделано callable(getattr(object, method))
, как уже упоминалось там.
Чтобы проверить, имеет ли он конкретный метод:
hasattr(object,"method")
if hasattr(obj,method) and callable(getattr(obj,method)):
– Bruno Bronosky
26 March 2013 в 16:33
hasattr
помог моему варианту использования найти, имеет ли объект python определенную переменную или метод члена.
– Akshay
13 February 2017 в 09:08
... существует, по крайней мере, простой способ проверить, есть ли у него конкретный метод, отличный от простого проверки, возникает ли ошибка при вызове метода
Легче просить прощения, чем разрешение ", безусловно, является путинским, то, что вы ищете, может быть:
d={'foo':'bar', 'spam':'eggs'} if 'get' in dir(d): d.get('foo') # OUT: 'bar'
Я считаю, что вы хотите что-то вроде этого:
список атрибутов от объекта
blockquote>По моему скромному мнению, в функции
dir()
может выполнить эту работу за вас. Взято из выводаhelp(dir)
в вашей оболочке Python:dir (...)
dir([object]) -> list of strings
Если вызывается без аргумента, верните имена в текущей области .
Else, верните алфавитный список имен, содержащий (некоторые) атрибуты данного объекта и атрибуты, доступные из него.
Если объект поставляет метод с именем
__dir__
, он будет использоваться; в противном случае используется логика dir () по умолчанию и возвращает:blockquote>
- для объекта модуля: атрибуты модуля.
- для объекта класса: его атрибуты и рекурсивно атрибуты его баз.
- для любого другого объекта: его атрибуты, атрибуты его класса и рекурсивно атрибуты базовых классов его класса.
Например :
$ 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("")
Надеюсь, что я внесла свой вклад:).
Можно создать функцию 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']
Возьмите список как объект
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']
В дополнение к более прямым ответам, я был бы упущен, если бы не упомянул iPython . Нажмите «вкладку», чтобы просмотреть доступные методы с автозаполнением.
И как только вы нашли метод, попробуйте:
help(object.method)
, чтобы увидеть подпись pydocs, подпись метода и т. Д. .
Ahh ... REPL .
Самый простой способ - использовать dir (objectname). Он отобразит все методы, доступные для этого объекта. Прохладный трюк.
Для поиска конкретного метода во всем модуле
for method in dir(module) :
if "keyword_of_methode" in method :
print(method, end="\n")
Откройте оболочку bash (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 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(
Самый простой способ получить список методов любого объекта - использовать команду help()
.
%help(object)
В нем будут перечислены все доступные / важные методы, связанные с этим объектом.
Например:
help(str)
[getattr(obj, method) for method in dir(obj) if method==method_name and callable(getattr(obj, method_name))]
, который можно использовать как: 'obj = {' foo ':' bar '}; method_name = 'получить'; x = [getattr (obj, method) для метода в dir (obj), если метод == method_name и callable (getattr (obj, method_name))]; а затемif(len(x)): x[0]('foo')
... Я знаю, что это действительно противно на одной строке, но комментарии не позволяют разрывов строк – Bruno Bronosky 26 March 2013 в 16:28print [method for method in dir(object) if callable(getattr(object, method))]
. – Orienteerix 29 October 2015 в 11:51