Как посмотреть все методы класса python

Как узнать, какие методы есть у объекта Python

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

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

20 ответы

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

Я обнаружил это в дайвинтопитон.нет (сейчас в архиве). Надеюсь, это даст дополнительную информацию!

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

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

ответ дан 02 дек ’20, 13:12

Это понимание списка, возвращающее список методов, где метод — это элемент в списке, возвращаемом dir (object), и где каждый метод добавляется в список только в том случае, если getattr (object, method) возвращает вызываемый объект. — Мнебуэрко

Как именно вы это используете? Сказать, распечатать список методов. — болото

@marsh Чтобы распечатать методы: print [method for method in dir(object) if callable(getattr(object, method))] . — Ориентирикс

Я получаю AttributeError: module ‘pandas.core.common’ has no attribute ‘AbstractMethodError’ когда я пытаюсь запустить это. См. Подробности на stackoverflow.com/q/54713287/9677043. — Карл Бейкер

не работает для объекта фрейма данных pandas в python 3.6. — Стефан Карлссон

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

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

Смотрите пост в Руководство по самоанализу Python чтобы получить больше информации.

Создан 26 июля ’12, 18:07

hasattr помог моему варианту использования определить, имеет ли объект python конкретную переменную или метод-член. — Акшай

Я не уверен, почему это решение не получило достаточно голосов. Это кратко и точно. — Прасад Рагхавендра

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

Он также отображает атрибуты объекта, поэтому, если вы хотите специально найти методы, это не сработает. — Эриком

Да. Согласовано. Но мне неизвестен какой-либо другой способ получить только список методов. Возможно, лучше всего получить список атрибутов и методов, а затем использовать чтобы отфильтровать его дальше? — Паван Кумар

@neuronet, я пытаюсь запустить принятый ответ, но получаю AttributeError: module ‘pandas.core.common’ has no attribute ‘AbstractMethodError’ . Любые идеи? См. Подробности на stackoverflow.com/q/54713287/9677043. +1 к @Pawan Kumar b / c ответ работает, а к @ljs за обещание отфильтрованного списка только методов. — Карл Бейкер

Я считаю, что вам нужно что-то вроде этого:

Встроенная функция dir() может сделать эту работу.

Взято из help(dir) вывод в вашей оболочке Python:

  • для объекта модуля: атрибуты модуля.
  • для объекта класса: его атрибуты и рекурсивно атрибуты его баз.
  • для любого другого объекта: его атрибуты, атрибуты его класса и рекурсивно атрибуты базовых классов его класса.

Например:

ответ дан 02 дек ’20, 13:12

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

Создан 30 июля ’12, 05:07

поскольку OP ищет метод, а не только атрибут, я думаю, вы хотите пойти еще дальше: if hasattr(obj,method) and callable(getattr(obj,method)): — Бруно Броноски

Помимо более прямых ответов, я бы упустил, если бы не упомянул IPython.

Удар Tab чтобы увидеть доступные методы с автозаполнением.

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

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

ответ дан 02 дек ’20, 13:12

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

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

Для самих методов:

Иногда inspect.isroutine тоже может быть полезен (для встроенных модулей, расширений C, Cython без директивы компилятора «привязки»).

Разве вы не должны использовать inspect.getmembers Вместо того, чтобы использовать dir в понимании списка? — Борис

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

ответ дан 02 дек ’20, 13:12

Пока мы говорим о подобных обходных путях, я добавлю, что вы также можете запустить ipython , начните вводить объект и нажмите tab и это тоже сработает. Никаких настроек чтения не требуется — Макс Коплан

@MaxCoplan Я добавил обходной путь в код для случаев, когда завершение табуляции не включено по умолчанию — Валерий Рамусик

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

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

ответ дан 02 дек ’20, 13:12

Что это % делать в первом примере? Это не работает в моем Python 2.7. — Скоркио

@Scorchio Я использовал «%» в качестве подсказки вместо «>>>» для python. Вы можете удалить% перед запуском команды. — Паритош Вяс

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

В Python вы можете перехватить вызов точки через __getattr__ и __getattribute__ , что позволяет создавать метод «во время выполнения»

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

И поэтому вы используете Проще просить прощения, чем разрешения парадигмы в Python.

ответ дан 02 дек ’20, 13:12

Это должно работать 🙂

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

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

Предположим, у нас есть Python obj . Затем, чтобы увидеть все имеющиеся у него методы, в том числе и те, что окружены __ (магические методы):

Чтобы увидеть только методы, доступные через инфиксную (точечную) нотацию, нужно:

ответ дан 14 дек ’20, 03:12

Можно создать getAttrs функция, которая будет возвращать имена вызываемых свойств объекта

ответ дан 24 апр.

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

Вы можете использовать dir (), который предопределен в Python.

Вы также можете передать объект в dir () как

Если объект является объектом предопределенного класса, такого как int, str и т. Д., Он отображает методы в нем (вы можете знать эти методы как встроенные функции). Если этот объект создан для определенного пользователем класса, он отображает все методы, данные в этом классе.

ответ дан 02 дек ’20, 13:12

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

ответ дан 09 мар ’18, в 13:03

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

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

ответ дан 02 дек ’20, 13:12

Я выполнил следующую функцию ( get_object_functions ), который получает объект ( object_ ) в качестве аргумента, и возвращает список ( functions ), содержащий все методы (включая статические методы и методы класса), определенные в классе объекта.:

Ну, он просто проверяет, равно ли строковое представление типа атрибута класса «<class ‘function’>» or «<class ‘method’>» а затем включает этот атрибут в functions перечислите, если это True .

Результат

ответ дан 02 дек ’20, 13:12

Если вы, например, используете shell plus, вы можете использовать это вместо:

таким образом, с «??» сразу после вашего объекта он покажет вам все атрибуты / методы, которые есть у класса.

ответ дан 24 апр.

Что такое «оболочка плюс»? — Питер Мортенсен

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками python introspection or задайте свой вопрос.

Модуль inspect в Python

Модуль inspect Python – очень полезный модуль, который используется для интроспекции объектов в программе и просмотра исходного кода модулей, классов и функций, которые используются во всей программе.

Модуль фактически может использоваться для извлечения исходного кода самой функции, анализа аргументов, которые эта функция принимает.

Предоставление образца модуля

Сейчас мы создадим образец модуля с некоторыми функциями, классами и строками документации в Python. Вот фрагмент кода для sample.py:

Теперь, когда у нас есть образец модуля, готовый к использованию, мы можем начать извлекать и анализировать его исходный код, строку документации и детали объекта. Давайте начнем.

Изучение модуля

Давайте начнем с самоанализа определенного нами образца модуля. Обратите внимание, что для этого у нас есть файл образца модуля sample.py в том же каталоге, в котором мы выполняем наши скрипты. Вот фрагмент образца кода о том, как мы можем проверить наш модуль:

Посмотрим на результат этой программы:

Модуль самоанализа с инспектированием

Получение классов

Мы можем получить все классы, присутствующие в модуле, и предпринять действия, когда найдем класс, который искали:

Посмотрим на результат этой программы:

Изучение классов модулей с помощью inspect

Изучение методов класса

На этот раз мы пойдем дальше, исследуя методы, присутствующие в классе. Обратите внимание, что мы используем один и тот же метод getmembers, отличается только идентификатор свойства, то есть isfunction:

Посмотрим на результат этой программы:

Изучение методов класса

Проверка объектов класса

С помощью модуля inspect можно отслеживать все экземпляры класса, созданные в программе, с помощью одного вызова функции:

Посмотрим на результат этой программы:

Проверка объектов класса

Получение строки документации для класса

Модуль inspect часто используется в инструментах Python, которые автоматизируют процесс извлечения классов и строк документации их методов, которые могут быть представлены конечным пользователям. Это означает, что разработчик может просто поместить строки документации в метод, и ту же строку можно использовать для представления другому разработчику приложения:

Пример inspect getdoc в python

Получение исходного кода класса

В интеллектуальных средах, таких как IDE, модуль inspect используется для представления исходного кода модулей, классов и функций:

Посмотрим на результат этой программы:

Получение исходного кода класса

Получение источника метода

На этот раз мы получаем исходный код только одного метода:

Посмотрим на результат этой программы:

Получение исходного кода метода

Получение подписи метода

В качестве последнего примера мы получим сигнатуру метода, который часто используется в Intellisense IDE, чтобы представить разработчикам, какие аргументы принимает метод:

Класс и объект в Python

Python — это процедурно-ориентированный и одновременно объектно-ориентированный язык программирования.

Процедурно-ориентированный

«Процедурно-ориентированный» подразумевает наличие функций. Программист может создавать функции, которые затем используются в сторонних скриптах.

Объектно-ориентированный

«Объектно-ориентированный» подразумевает наличие классов. Есть возможность создавать классы, представляющие собой прототипы для будущих объектов.

Создание класса в Python

Синтаксис для написания нового класса:

  • Для создания класса пишется ключевое слово class , его имя и двоеточие (:). Первая строчка в теле класса описывает его. (По желанию) получить доступ к этой строке можно с помощью ClassName.__doc__
  • В теле класса допускается объявление атрибутов, методов и конструктора.

Атрибут:

Атрибут — это элемент класса. Например, у прямоугольника таких 2: ширина ( width ) и высота ( height ).

Метод:

  • Метод класса напоминает классическую функцию, но на самом деле — это функция класса. Для использования ее необходимо вызывать через объект.
  • Первый параметр метода всегда self (ключевое слово, которое ссылается на сам класс).

Конструктор:

  • Конструктор — уникальный метод класса, который называется __init__ .
  • Первый параметр конструктора во всех случаях self (ключевое слово, которое ссылается на сам класс).
  • Конструктор нужен для создания объекта.
  • Конструктор передает значения аргументов свойствам создаваемого объекта.
  • В одном классе всегда только один конструктор.
  • Если класс определяется не конструктором, Python предположит, что он наследует конструктор родительского класса.

Создание объекта с помощью класса Rectangle:

Создание объекта с помощью класса Rectangle

Расчет площади класса Rectangle

Что происходит при создании объекта с помощью класса?

При создании объекта класса Rectangle запускается конструктор выбранного класса, и атрибутам нового объекта передаются значения аргументов. Как на этом изображении:

Конструктор выбранного класса

Конструктор с аргументами по умолчанию

В других языках программирования конструкторов может быть несколько. В Python — только один. Но этот язык разрешает задавать значение по умолчанию.

Все требуемые аргументы нужно указывать до аргументов со значениями по умолчанию.

Конструктор с аргументами по умолчанию

Сравнение объектов

В Python объект, созданный с помощью конструктора, занимает реальное место в памяти. Это значит, что у него есть точный адрес.

Если объект AA — это просто ссылка на объект BB , то он не будет сущностью, занимающей отдельную ячейку памяти. Вместо этого он лишь ссылается на местоположение BB .

Как происходит сравнение объектов

Оператор == нужен, чтобы узнать, ссылаются ли два объекта на одно и то же место в памяти. Он вернет True , если это так. Оператор != вернет True , если сравнить 2 объекта, которые ссылаются на разные места в памяти.

Сравнение объектов

Атрибуты

В Python есть два похожих понятия, которые на самом деле отличаются:

  1. Атрибуты
  2. Переменные класса

Стоит разобрать на практике:

Атрибут

Объекты, созданные одним и тем же классом, будут занимать разные места в памяти, а их атрибуты с «одинаковыми именами» — ссылаться на разные адреса. Например:

Объекты одного класса занимают разные места в памяти

Изменение значений атрибутов

Python умеет создавать новые атрибуты для уже существующих объектов. Например, объект player1 и новый атрибут address .

Встроенные атрибуты класса

Объекты класса — дочерние элементы по отношению к атрибутам самого языка Python. Таким образом они заимствуют некоторые атрибуты:

Атрибут Описание
__dict__ Предоставляет данные о классе коротко и доступно, в виде словаря
__doc__ Возвращает строку с описанием класса, или None , если значение не определено
__class__ Возвращает объект, содержащий информацию о классе с массой полезных атрибутов, включая атрибут __name__
__module__ Возвращает имя «модуля» класса или __main__ , если класс определен в выполняемом модуле.

Переменные класса

Переменные класса в Python — это то же самое, что Field в других языках, таких как Java или С#. Получить к ним доступ можно только с помощью имени класса или объекта.

Для получения доступа к переменной класса лучше все-таки использовать имя класса, а не объект. Это поможет не путать «переменную класса» и атрибуты.

Переменные класса

У каждой переменной класса есть свой адрес в памяти. И он доступен всем объектам класса.

Составляющие класса или объекта

В Python присутствует функция dir , которая выводит список всех методов, атрибутов и переменных класса или объекта.

inspect — Инспекция «живых» объектов на Python

Модуль inspect на Python предоставляет множество полезных функций, которые помогают Вам получить информацию о живых объектах, таких как модули, классы, методы, функции, трассировка, объекты фрейма и кода. Например, он может помочь Вам проверить контекст класса, получить исходный код метода, извлечь и отформатировать список аргументов для функции, или получить всю информацию, которая Вам нужна для отображения подробной трассировки.

Есть четыре основных вида сервисов, предоставляемых этим модулем: проверка типа, получение исходного кода, инспекция классов и функций, и проверка стэка интерпретатора.

Типы и члены

Функция getmembers() получает члены объекта, такого как класс или модуль. Шестнадцать функций, чьи имена начинаются с is в основном являются подходящим выбором в качестве второго аргумента для getmembers(). Кроме того, они помогают Вам определить, когда Вы можете ожидать обнаружить следующие специальные атрибуты:

Тип Атрибут Описание
module __doc__ строка документации
__file__ имя файла (отсутствует для встроенных модулей)
class __doc__ строка документации
__module__ имя модуля в котором определён этот класс
method __doc__ строка документации
__name__ имя, с которым был определён этот метод
im_class объект класса, у которого запрашивается этот метод
im_func или __func__ объект функции, содержащий реализацию метода
im_self or __self__ экземпляр, к которому привязан метод, или None
function __doc__ строка документации
__name__ имя, с которым эта функция была определена
func_code объект кода, содержащий скомпилированный bytecode функции
func_defaults кортеж значений по умолчанию для аргументов
func_doc (то же, что и __doc__)
func_globals глобальное пространство имён, в котором была определена функция
func_name (то же, что и __name__)
generator __iter__ определена для поддержки итерации через контейнер
close вызывает исключение GeneratorExit внутри генератора, чтобы прекратить итерацию
gi_code объект кода
gi_frame объект фрейма или, возможно, None, если генератор был исчерпан
gi_running равен 1, если генератор исчерпан, иначе 0
next возвращает следующий элемент из контейнера
send возобновляет генератор и посылает значение, которое становится результатом текущего выражения yield
throw используется для возбуждения исключения внутри генератора
traceback tb_frame объект фрейма на этом уровне
tb_lasti индекс последней применённой инструкции в байткоде
tb_lineno номер текущей строки в исходном коде Python
tb_next следующий внутренний объект трассировки (вызываемый на этом уровне)
frame f_back следующий внешний объект фрейма (вызывающий этот фрейм)
f_builtins встроенное пространство имён, видимое этим фреймом.
f_code объект кода, выполняемый в этом фрейме
f_exc_traceback трассировка, если есть в этом фрейме, иначе None
f_exc_type f_exc_type тип исключения, если возникает в этом фрейме, иначе None
f_exc_value значение исключения, если возникает в этом фрейме, иначе None
f_globals f_globals глобальное пространство имён, видимое этим фреймом
f_lasti f_lasti индекс последней выполненной инструкции в байткоде
f_lineno номер текущей строки в исходном коде Python
f_locals f_locals локальное пространство имён, видимое в этом фрейме
f_restricted 0 или 1, если фрейм находится в ограниченном режиме выполнения
f_trace трассировочная функции для этого фрейма, или None
code co_argcount число аргументов (не включая аргументы * или **)
co_code строка, или сырой скомпилированный байт-код
co_consts co_consts кортеж констант, используемых в байт-коде
co_filename имя файла, в котором этот объект кода был создан
co_firstlineno номер первой строки в исходном коде Python
co_flags bitmap: 1=optimized | 2=newlocals | 4=*arg | 8=**arg
co_lnotab кодированное отображение номер стр+оки на индекс байт-кода
co_name имя, с которым этот объект кода был определён
co_names кортеж имён локальных переменных
co_nlocals co_nlocals количество локальных переменных
co_stacksize требуемый стек для виртуальной машины
co_varnames кортеж имён аргументов и локальных переменных
builtin __doc__ строка документации
__name__ оригинальные имя этой функции или метода
__self__ экземпляр, к которому привязан этот метод, или None
  1. Changed in version 2.2: im_class используется для ссылки на класс, который определяет этот метод

inspect.getmembers(object[, predicate])

Возвращает все члены объекта в списке, состоящем из пар вида (name, value), отсортированных по имени. Если передан не обязательный аргумент predicate, то будут включены только те члены, для которых predicate возвращает True.

getmembers() не возвращает атрибуты метакласса, если аргумент является классом (это поведение унаследовано из функции dir()).

inspect.getmoduleinfo(path)

Возвращает кортеж значений, который описывает как Python будет интерпретировать файл, определяемый path, если это модуль, или None, если он не может быть идентифицирован как модуль. Возвращаемый кортеж имеет вид (name, suffix, mode, module_type)«, где *name — имя модуля без имён окружающих его пакетов, suffix — оставшаяся часть имени файла (может не быть расширением с точкой), mode — режим для функции open(), который будет использоваться (‘r’ или ‘rb’) и module_type — число, определяющее тип модуля. module_type будет иметь значение, которое можно сравнить с константами, определёнными в модуле imp, более подробную информацию можно найти в документации к тому модулю.

Changed in version 2.6: Возвращает named tuple ModuleInfo(name, suffix, mode, module_type).

inspect.getmodulename(path)

Возвращает имя модуля, определённого путём path, без окружающих его пакетов. Используется тот же самый алгоритм, который использует интерпретатор при поиске модулей. Если по этому имени по правилам интерпретатора невозможно найти модуль будет возвращено None.

inspect.ismodule(object)

Возвращает true, если объект является модулем.

inspect.isclass(object)

Возвращает true, если объект является классом, не важно, встроенным или пользовательским.

inspect.ismethod(object)

Возвращает true, если объект является связанным методом, написанным на Python.

inspect.isfunction(object)

Возвращает true, если объект является функцией Python, сюда же относятся функции, созданные при помощи выражения lambda.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *