Как найти все методы данного класса в Python?
Всем привет! В сегодняшней статье мы посмотрим, как мы можем найти все методы данного класса.
- Автор записи
Как найти все методы данного класса в Python?
Всем привет! В сегодняшней статье мы посмотрим, как мы можем найти все методы данного класса.
Часто очень удобно перечислить все методы класса напрямую, чтобы мы могли выполнить некоторую предварительную обработку на основе определенных методов.
Давайте начнем! Мы покажем вам некоторые способы сделать это, и вы можете использовать любой из методов ниже.
Определите наш класс шаблона
Давайте сначала определим манекет, из которого мы можем проверить наши выходы.
Рассмотрим класс ниже, который имеет некоторые методы:
Класс хранит плавучую точку Государство Атрибут, который мы можем манипулировать с помощью арифметических операций.
Давайте теперь посмотрим на некоторые способы перечислять методы для нашего пользовательского класса.
Способ 1 – Использование функции DIR () для перечисления методов в классе
Чтобы перечислить методы этого класса, один подход – использовать функцию DIR () в Python.
dir () Функция вернет все функции и свойства класса.
Посмотрим, что произойдет, если мы попробуем это для MyClass Отказ
Хорошо, мы видим, что у нас есть наш Добавить , Разделить , вычесть и Умножьте Методы перечислены! Однако как насчет всех других методов?
Ну, эти методы (те, которые начинаются с двойного поднятия), называются Методы гуляния Отказ
Они обычно называются функцией обертки. Например, Dict () Функция вызывает __dict __ () метод.
Фильтрация расположенных методов от выхода
Обычно нам не понадобится префиксные методы двойной подчеркивания, поэтому мы можем отфильтровать их с помощью приведенного ниже фрагмента:
Ух ты! Теперь мы только получаем арифметические методы, которые мы хотели!
Однако наше настоящее решение имеет проблему.
Помните, что dir () Вызывает как методы, так и свойства класса?
Обращение с свойствами класса
Если бы у нас была собственность внутри класса, он тоже будет перечислять. Рассмотрим ниже пример.
Теперь, что вы думаете, что вывод будет?
Это дает нам Property1 Также, что не то, что мы хотим.
Нам нужно сделать еще один фильтр для дифференцировки между методом и свойством.
Но это действительно просто. Основное отличие состоит в том, что любой объект недвижимости Не Callable, в то время как методы можно назвать!
В Python мы можем использовать булевую функцию Callable (атрибут) Чтобы проверить, можно ли назвать атрибут.
Давайте теперь включаем это в наш старый код.
Давайте сломаемся, написав его без понимания списка:
Мы также изменили Метод к атрибут Так что это удаляет вводящее в заблуждение намерения!
Давайте проверим это сейчас.
Действительно, мы действительно получим свой список методов без свойств!
Метод 2 – Использование OptParse.optionparter
Теперь это еще один подход, который вы можете использовать, если вы не слишком удобны с помощью dir () Отказ
Мы можем использовать проверять Модуль, чтобы перечислить методы.
А именно, мы можем использовать Inspect.getMembers (экземпляр,. Сизлет) получить список методов.
Это автоматически выполнит работу для вас, и вам просто нужно иметь дело с выходом. Давайте посмотрим на пример.
Мы можем получить первый элемент каждого кортежа, чтобы получить имя метода.
Предостережения использования модуля проверки
Обратите внимание, что получаем список кортежей. Первый элемент кортежа – это имя функции, которую второй элемент представляет собой сам объект метода.
Хотя это может показаться хорошим решением, вы можете заметить некоторые вещи.
- Для dir () Мы напрямую использовали саму название класса. Но здесь нам нужно пройти экземпляр.
- StaticMethods также не отображаются в списке. В зависимости от вашего случая использования, вы можете/не понадобиться.
Из-за вышеупомянутых точек я бы предложил вам оставаться простой и использовать dir () Функция!
Заключение
В этой статье мы видели, как мы могли бы перечислить все методы данного класса в Python.
Ответы на вопросы с PyObject
Для удобства проверки создадим небольшой тестовый класс:
1. Как получить список всех атрибутов объекта
2. Как получить список всех публичных атрибутов объекта
В Python для обозначения protected атрибутов используют «_», для private — «__» перед названием переменной. Следовательно, для получения списка только публичных атрибутов, список все атрибутов нужно отфильтровать. Сделать это можно или с помощью списковых выражений (list comprehension):
или воспользоваться функцией filter:
Как по мне, то первый вариант является более предпочтительным по причине большей читабельности.
3. Как получить список методов объекта
Поскольку функции и методы в Python являются объектами первого рода (вроде правильно написал?), то для проверки будем использовать функцию getattr, которая возвращает сам аттрибут объекта и функцию callable, которая и осуществляет проверку.
4. В какой «магической» переменной хранится содержимое help?
В атрибуте __doc__. В данную переменную заносится комментарий сразу после
объявления класса/метода/функции (см. тестовый класс).
Так же можно воспользоваться функцией help в интерактивном режиме:
5. Есть два кортежа, получить третий как конкатенацию первых двух
6. Есть два кортежа, получить третий как объединение уникальных элементов первых двух кортежей
В данном задании я видел 2 подхода:
1. писать циклы для проверки вхождения элемента в кортежи
2. воспользоваться встроенным типом set (по сути — хеш), над которым можно применять логические операции.
Решение с использованием второго подхода (используется XOR):
7. Почему если в цикле меняется список, то используется for x in lst[:], что означает [:]?
[:] — обозначение среза в питоне. Про них можно почитать, например, тут. В кратце: [:] создает копию lst и изменения в первом никак не влияют на итерацию по исходным значениям.
8. Есть два списка одинаковой длины, в одном ключи, в другом значения. Составить словарь.
Будем использовать функцию zip, которая делает кортежи из пары значений и dict, которая создает словарь из переданных аргументов.
9. Есть два списка разной длины, в одном ключи, в другом значения. Составить словарь. Для ключей, для которых нет значений использовать None в качестве значения. Значения, для которых нет ключей игнорировать.
В данном случае будем использовать функции zip, map. Особенностью zip является то, что возвращаемый результат ограничен самым коротким итерируемым. То есть это прекрасно подходит нам для случая, когда значений больше чем ключей. Во второй ветке python у map есть одна документированная особенность, а именно — если какое-либо из итерируемых значений короче других, оно дополняется с помощью None. Если вместо функции передано None, выполняется объединение и на выходе мы получаем те же кортежи.
Как вариант, можно рассмотреть использование функции itertools.izip_longest, которая была добавлена в 2.6.
10.Есть словарь. Инвертировать его. Т.е. пары ключ: значение поменять местами — значение: ключ.
Как вариант — опять использовать функцию zip.
P.S. прошу гуру подсказать, что правильней использовать в данном случае — zip или itertools.izip. Тоже самое относится и к values/itervalues.
11. Есть строка в юникоде, получить 8-битную строку в кодировке utf-8 и cp1251
Писал прямо во время написания статьи, но если правильно понял задание, то:
12. Есть строка в кодировке cp1251, получить юникодную строку
Аналогично:
Функции
1. Написать функцию, которой можно передавать аргументы либо списком/кортежем, либо по одному. Функция производит суммирование всех аргументов.
Решение вижу следующим: итерация по переданному списку. В случае если элемент списка — имеет атрибут __len__, а значит является итерируемым, разворачиваем его и передаем в нашу функцию.
2. Написать функцию-фабрику, которая будет возвращать функцию сложения с аргументом.
Так как функции являются объектами первого рода (если лажать, так по-крупному), то одними из вариантов их использования являются возврат их из других функций или методов и передача в качестве в аргументов. Суть сводится к тому, что мы должны вернуть функцию сложения, один из аргументов
которой задан при ее создании, а второй может варьироваться. Как я понимаю, это — замыкание — доступ к переменным, объявленным вне тела функции.
3. Написать фабрику, аналогичную п.2, но возвращающей список таких функций
В данном случае есть смысл возвращать список функций, которые мы написали выше.
Выглядеть будет примерно так:
4. Написать аналог map:
— первым аргументом идет либо функция, либо список функций
— вторым аргументом — список аргументов, которые будут переданы функциям
— полагается, что эти функции — функции одного аргумента
Данное задание я реализовал с использованием встроенного map (как вариант — заменен циклом). Так же, для проверки типа переданного значения использовал функцию isinstance и модуль collections, как аналог hasattr и магическому методу __len__.
Итераторы
Маленькое отступление. Я не видел особого смысла писать код итераторов, т.к. их код описан в документации к модулю itertools. Врядли я напишу лучше.
Итераторы основываются на генераторах, о которых есть прекрасная статья.
Модули
1. У нас есть импортированный модуль foo, как узнать физический путь файла, откуда он импортирован?
Путь хранится в аттрибуте __file__ модуля.
2. Из модуля foo вы импортируете модуль feedparser. Версия X feedparser’а есть в общесистемном каталоге site-packages, версия Y — рядом с модулем foo. Определена переменная окружения PYTHONPATH, и там тоже есть feedparser, версии Z. Какая версия будет использоваться?
Будет импортирована версия Y.
Согласно документации (6 раздел туториала), порядок импорта следующий:
1. директория рядом со скриптом, который был запущен
2. PYTHONPATH
3. системный каталог
3. Как посмотреть список каталогов, в которых Python ищет модули?
4. У вас есть модуль foo, внутри него импортируется модуль bar. Рядом с модулем foo есть файлы bar.py и bar/__init__.py Какой модуль будет использоваться.
Будет использован второй, т.е. пакет. Как я понял, происходит рекурсивный обход директорий, и пакеты импортируются первыми.
5. Что означает и для чего используется конструкция __name__ == ‘__main__’
Используется для определения был ли файл импортирован или запущен. Если мы его запускаем, то значение будет __main__, если импортируем — имя модуля.
How do I get list of methods in a Python class?
I want to iterate through the methods in a class, or handle class or instance objects differently based on the methods present. How do I get a list of class methods?
- How can I list the methods in a Python 2.5 module?
- Looping over a Python / IronPython Object Methods
- Finding the methods an object has
- How do I look inside a Python object?
- How Do I Perform Introspection on an Object in Python 2.x?
- How to get a complete list of object’s methods and attributes?
- Finding out which functions are available from a class instance in python?
24 Answers 24
An example (listing the methods of the optparse.OptionParser class):
Notice that getmembers returns a list of 2-tuples. The first item is the name of the member, the second item is the value.
You can also pass an instance to getmembers :
There is the dir(theobject) method to list all the fields and methods of your object (as a tuple) and the inspect module (as codeape write) to list the fields and methods with their doc (in «»»).
Because everything (even fields) might be called in Python, I’m not sure there is a built-in function to list only methods. You might want to try if the object you get through dir is callable or not.
Python 3.x answer without external libraries
![]()
Say you want to know all methods associated with list class Just Type The following
Above will give you all methods of list class
![]()
Try the property __dict__ .
![]()
you can also import the FunctionType from types and test it with the class.__dict__ :
![]()
You can list all methods in a python class by using the following code
This will return a list of all the names of the methods in the class
![]()
Note that you need to consider whether you want methods from base classes which are inherited (but not overridden) included in the result. The dir() and inspect.getmembers() operations do include base class methods, but use of the __dict__ attribute does not.
If your method is a "regular" method and not a staticmethod , classmethod etc.
There is a little hack I came up with —
This can be extended to other type of methods by changing "function" in the if condition correspondingly.
Tested in Python 2.7 and Python 3.5.
![]()
Try print(help(ClassName)) It prints out methods of the class
I just keep this there, because top rated answers are not clear.
This is simple test with not usual class based on Enum.
And this is output results.
So what we have:
- dir provide not complete data
- inspect.getmembers provide not complete data and provide internal keys that are not accessible with getattr()
- __dict__.keys() provide complete and reliable result
Why are votes so erroneous? And where i’m wrong? And where wrong other people which answers have so low votes?
![]()
There’s this approach:
When dealing with a class instance, perhaps it’d be better to return a list with the method references instead of just names¹. If that’s your goal, as well as
- Using no import
- Excluding private methods (e.g. __init__ ) from the list
It may be of use. You might also want to assure it’s callable(getattr(obj, m)) , since dir returns all attributes within obj , not just methods.
In a nutshell, for a class like
We could check instance retrieval with
So you can call it right away:
I used this for unit testing. Had a class where all methods performed variations of the same process — which led to lengthy tests, each only a tweak away from the others. DRY was a far away dream.
Thought I should have a single test for all methods, so I made the above iteration.
Although I realized I should instead refactor the code itself to be DRY-compliant anyway. this may still serve a random nitpicky soul in the future.