Получить методы объекта python

Как найти все методы данного класса в Python?

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

Как найти все методы данного класса в Python?

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

Часто очень удобно перечислить все методы класса напрямую, чтобы мы могли выполнить некоторую предварительную обработку на основе определенных методов.

Давайте начнем! Мы покажем вам некоторые способы сделать это, и вы можете использовать любой из методов ниже.

Определите наш класс шаблона

Давайте сначала определим манекет, из которого мы можем проверить наши выходы.

Рассмотрим класс ниже, который имеет некоторые методы:

class MyClass(object): def __init__(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = a def add(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state + a return self.state def subtract(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state - a return self.state def multiply(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state * a return self.state def divide(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state / a return self.state

Класс хранит плавучую точку Государство Атрибут, который мы можем манипулировать с помощью арифметических операций.

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

Способ 1 – Использование функции DIR () для перечисления методов в классе

Чтобы перечислить методы этого класса, один подход – использовать функцию DIR () в Python.

dir () Функция вернет все функции и свойства класса.

Посмотрим, что произойдет, если мы попробуем это для MyClass Отказ

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'add', 'divide', 'multiply', 'subtract']

Хорошо, мы видим, что у нас есть наш Добавить , Разделить , вычесть и Умножьте Методы перечислены! Однако как насчет всех других методов?

Читайте также:  Java ооп наследование пример

Ну, эти методы (те, которые начинаются с двойного поднятия), называются Методы гуляния Отказ

Они обычно называются функцией обертки. Например, Dict () Функция вызывает __dict __ () метод.

Фильтрация расположенных методов от выхода

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

method_list = [method for method in dir(MyClass) if method.startswith('__') is False] print(method_list)
['add', 'divide', 'multiply', 'subtract']

Ух ты! Теперь мы только получаем арифметические методы, которые мы хотели!

Однако наше настоящее решение имеет проблему.

Помните, что dir () Вызывает как методы, так и свойства класса?

Обращение с свойствами класса

Если бы у нас была собственность внутри класса, он тоже будет перечислять. Рассмотрим ниже пример.

class MyClass(object): # MyClass property property1 = [1, 2, 3] def __init__(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = a def add(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state + a return self.state def subtract(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state - a return self.state def multiply(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state * a return self.state def divide(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state / a return self.state @staticmethod def global_method(a, b): return a + b @classmethod def myclass_method(cls): return cls method_list = [method for method in dir(MyClass) if method.startswith('_') is False] print(method_list)

Теперь, что вы думаете, что вывод будет?

['add', 'divide', 'global_method', 'multiply', 'myclass_method', 'property1', 'subtract']

Это дает нам Property1 Также, что не то, что мы хотим.

Нам нужно сделать еще один фильтр для дифференцировки между методом и свойством.

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

В Python мы можем использовать булевую функцию Callable (атрибут) Чтобы проверить, можно ли назвать атрибут.

Давайте теперь включаем это в наш старый код.

method_list = [attribute for attribute in dir(MyClass) if callable(getattr(MyClass, attribute)) and attribute.startswith('__') is False] print(method_list)

Давайте сломаемся, написав его без понимания списка:

method_list = [] # attribute is a string representing the attribute name for attribute in dir(MyClass): # Get the attribute value attribute_value = getattr(MyClass, attribute) # Check that it is callable if callable(attribute_value): # Filter all dunder (__ prefix) methods if attribute.startswith('__') == False: method_list.append(attribute) print(method_list)

Мы также изменили Метод к атрибут Так что это удаляет вводящее в заблуждение намерения!

Читайте также:  Python packaging user guide

Давайте проверим это сейчас.

['add', 'divide', 'global_method', 'multiply', 'myclass_method', 'subtract']

Действительно, мы действительно получим свой список методов без свойств!

Метод 2 – Использование OptParse.optionparter

Теперь это еще один подход, который вы можете использовать, если вы не слишком удобны с помощью dir () Отказ

Мы можем использовать проверять Модуль, чтобы перечислить методы.

А именно, мы можем использовать Inspect.getMembers (экземпляр,. Сизлет) получить список методов.

Это автоматически выполнит работу для вас, и вам просто нужно иметь дело с выходом. Давайте посмотрим на пример.

import inspect class MyClass(object): # MyClass property property1 = [1, 2, 3] def __init__(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = a def add(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state + a return self.state def subtract(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state - a return self.state def multiply(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state * a return self.state def divide(self, a): assert isinstance(a, float) or isinstance(a, int) self.state = self.state / a return self.state @staticmethod def global_method(a, b): return a + b @classmethod def myclass_method(cls): return cls # Create our instance instance = MyClass(100) # Get the list of functions method_list = inspect.getmembers(MyClass, predicate=inspect.ismethod) print(method_list)
[('__init__', >), ('add', >), ('divide', >), ('multiply', >), ('myclass_method', >), ('subtract', >)] 

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

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

Обратите внимание, что получаем список кортежей. Первый элемент кортежа – это имя функции, которую второй элемент представляет собой сам объект метода.

Хотя это может показаться хорошим решением, вы можете заметить некоторые вещи.

  • Для dir () Мы напрямую использовали саму название класса. Но здесь нам нужно пройти экземпляр.
  • StaticMethods также не отображаются в списке. В зависимости от вашего случая использования, вы можете/не понадобиться.

Из-за вышеупомянутых точек я бы предложил вам оставаться простой и использовать dir () Функция!

Заключение

В этой статье мы видели, как мы могли бы перечислить все методы данного класса в Python.

использованная литература

Читайте ещё по теме:

Источник

Типы данных, основные конструкции. Python.

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

1. Как получить список всех атрибутов объекта?

Очень просто, используя стандартную функцию dir. В качестве аргумента передаем тот самый объект, в данном случае (для примера) объект string.

import string print dir(string) # Или так import inspect print [name for name, thing in inspect.getmembers(string)] 

Модуль inspect предоставляет несколько очень полезных методов которые позволяют собирать информацию о объектах Python, это достаточно важно, т.к. питон динамический ЯП и в нем очень просто сделать вещи которые обычно называют «хакерскими». Используя inspect можно получить содержимое класса, получить исходный код метода (ага, и поменять его), выделить формат и список аргументов функции и т.д.

2. Как получить список всех публичных атрибутов объекта?

Private методы в Python начинаются с «__» поэтому все что нужно сделать чтобы получить список public аттрибутов это отфильтровать все, что начинается с «__». Тут будет уместно использовать элемент функционального программирования — функцию filter(f, lst) которая формирует новый список элементов последовательности — lst руководствуясь функцией f.

import sting # так проще для понимания def f(x): if x[:2] == "__": return False else: return True print filter(f, [atr for atr in dir(string)]) # а это то же самое в одну строчку print filter(lambda x : False if not cmp(x[:2], "__") else True, [atr for atr in dir(string)]) 

3. Как получить список методов объекта?

Используя функцию callable() которая как бы говорит реально ли вызвать объект или нет. если вызвать реально — то это метод, если нет — то свойство

print filter(lambda x : callable(getattr(string, x)), [atr for atr in dir(string)]) 

4. В какой «магической» переменной хранится содержимое help?

Источник

Оцените статью