Вызываемые объекты в python

Магический метод вызова __call__ в Python

Имена методов с двойным подчеркиванием в качестве префиксов и суффиксов являются зарезервированными методами для конкретного использования в Python. Например, метод __init__ используется для конструкторов объектов или метод __call__ в Python для создания вызываемого объекта. Мы называем эти методы методами dunder, где dunder относится к Double Under(подчеркивание).

Магические методы

Эти хитрые методы также известны как магические методы – однако в них нет ничего магического. В сообществе Python есть много разработчиков, которые не являются большими поклонниками слова «магия», так как оно создает ощущение, что использование этого метода не рекомендуется, что очень противоречиво.

В данном руководстве рассмотрим магический метод вызова __call __ в Python

Понимание вызываемой функции

Объект в Python называется вызываемым, если этот объект определен в функции __call __(). Функция для того же самого может быть определена как x(arg 1, arg 2,…), что является сокращением от x .__ call __(arg1, arg2,…).

Примечание. Метод callable() возвращает логическое значение, определяющее, является ли объект вызываемым. Эта функция возвращает True, если объект вызывается; в противном случае он возвращает False. Более того, также возможно, что эта функция может вернуть True, даже если объект не является вызываемым. Тем не менее, если этот метод возвращает значение False, объект не может быть вызван.

Более того, класс Python всегда вызывается. Таким образом, мы всегда можем использовать функцию callable() с объектом класса, а не с самим классом.

Давайте рассмотрим следующий пример, чтобы понять поведение функции Python callable().

# creating a class class Employee: n = 0 # defining a function def __init__(self, emp_id): self.i = emp_id # instantiating the class x = Employee(15) # checking if the class and object are callable or not print('Employee Class is callable = ', callable(Employee)) print('Employee object is callable = ',
Employee Class is callable = True Employee object is callable = False

В приведенном выше примере мы определили класс Employee, который принимает переменную n = 0. Затем мы определили функцию и создали экземпляр класса. Наконец, мы проверили, можно ли вызвать класс и его объект, используя функцию callable().

Читайте также:  Дракон хартера хейтуэя python

Рассмотрим пример функции __call __().

# creating Person Class class Person: person_id = 0 person_name = "" # defining an initializing function def __init__(self, personid, personname): self.person_id = personid self.person_name = personname # defining a callable function def __call__(self, *args, **kwargs): print('Printing Arguments') print(*args) print('Printing Keyword Arguments') for key, value in kwargs.items(): print("%s == %s" %(key, value)) # instantiating the class m = Person(15, 'George') # printing the object print(m) # checking if the object is callable or not print("The Person object is callable: ", callable
The Person object is callable: True

В приведенном выше примере мы определили класс Person и переменные person_id = 0 и person_name = “”. Затем мы определили функцию инициализации вместе с вызываемой функцией. Наконец, мы создали экземпляр класса, распечатали объект и проверили, является ли объект вызываемым или нет. В результате объект person оказывается вызываемым.

Более того, мы можем заметить, что мы использовали * args, чтобы разрешить передачу переменных аргументов, и ** kwargs, чтобы разрешить передачу именованных аргументов методу __call __().

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

if callable(m): m() m(15, 30) m.__call__(15, 30) m(15, 30, ) m(15, 'B', personname = 'George', personid = 50)
Printing Arguments Printing Keyword Arguments Printing Arguments 15 30 Printing Keyword Arguments Printing Arguments 15 30 Printing Keyword Arguments Printing Arguments 15 30 Printing Keyword Arguments Printing Arguments 15 B Printing Keyword Arguments personname == George personid == 50

В приведенном выше примере мы определили if-оператор, в котором, если объект m вызывается, то объект вызывается как функция без аргументов, только с аргументами, с функцией __call __(), с аргументами разных типов и с аргументами и аргументы ключевого слова. В результате необходимые объекты были успешно вызваны.

Источник

Функции callable() и __call __() в Python

Функция callable (object) в Python возвращает True, если объект окажется вызываемым, в противном случае возвращает False.

Читайте также:  Нет python interpreter pycharm

Вызываемый объект __call __()

Объект называется вызываемым, если он определяет функцию __call __(). Если эта функция определена, то x (arg1, arg2,…) является сокращением для x .__ call __ (arg1, arg2,…).

Обратите внимание, что функция callable() возвращает True, если объект кажется вызываемым, возможно, что она вернет True, даже если объект не является вызываемым. Однако, если эта функция возвращает значение False, объект определенно нельзя вызвать.

Кроме того, класс в python всегда вызывается. Поэтому всегда используйте callable() с экземпляром класса, а не с самим классом. Давайте посмотрим на простой пример, чтобы проверить это поведение.

class Person: i = 0 def __init__(self, id): self.i = id p = Person(10) print('Person Class is callable = ', callable(Person)) print('Person object is callable = ', callable(p))
Person Class is callable = True Person object is callable = False

Функция callable в python

Пример

Определим класс с функцией __call __().

class Employee: name = "" def __init__(self, i, n): self.id = i self.name = n def __call__(self, *args, **kwargs): print('printing args') print(*args) print('printing kwargs') for key, value in kwargs.items(): print("%s == %s" % (key, value)) e = Employee(10, 'Pankaj') # creating object print(e) # printing object print(callable(e))

* args используется для передачи переменных аргументов функции __call __().

** kwargs используется для передачи именованных аргументов функции __call __().

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

if callable(e): e() # object called as a function, no arguments e(10, 20) # only args e.__call__(10, 20) e(10, 20, ) # only args of different types e(10, 'A', name='Pankaj', # args and kwargs both
printing args printing kwargs printing args 10 20 printing kwargs printing args 10 20 printing kwargs printing args 10 20 printing kwargs printing args 10 A printing kwargs name == Pankaj id == 20

Источник

Как использовать функцию callable() в Python

Python callable() — это встроенный метод, который возвращает значение True, если переданный объект кажется вызываемым, а если нет, то возвращает False. Callable означает, что есть что-то, что можно вызвать. Функция callable() возвращает True, если переданный объект кажется вызываемым. Если нет, возвращается False.

Читайте также:  Php server http header

Python callable()

Метод callable() принимает только один аргумент — object , и возвращает одно из двух значений (True, если объект кажется вызываемым).

Синтаксис

Метод callable() возвращает следующие логические значения:

Может быть несколько случаев, когда Python callable() возвращает true, но вызов объекта терпит неудачу. Но если это так и он возвращает False, вызов объекта никогда не будет успешным.

Здесь мы видим в первом случае, когда объект передается в метод callable(), и он возвращает True. Это так, потому что 11 является объектом вызываемой функции StrangerThings (что может быть не во всех случаях).

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

Вызываемый объект

Экземпляр класса App кажется вызываемым.

Когда Object Выглядит вызываемым, но не вызывается

Хорошо, давайте рассмотрим сценарий, в котором объект кажется вызываемым, но на самом деле он не вызывается.

Итак, он возвращает True, но не вызывается.

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

Каждый раз, когда вы определяете функцию, Питон создает вызываемый объект. В следующем примере вы можете определить функцию func следующими способами:

Метод callable() возвращает True, предполагая, что класс App является вызываемым, но экземпляр App не является callable() и возвращает ошибку времени выполнения.

Встроенный метод callable() проверяет, является ли аргумент:

  1. Экземпляр класса с методом __call__.
  2. Это тип, который указывает возможность вызова, например, в функциях, методах и т. д., или имеет ненулевой элемент tp_call(c struct).
  3. Если объект является экземпляром некоторого класса, он может быть вызван, если у него есть атрибут __call__.
  4. В противном случае объект x может быть вызван, если x->ob_type->tp_call != NULL.

Вы всегда можете использовать встроенную callable функцию, чтобы определить, является ли данный объект вызываемым, или, что еще лучше, просто вызвать его и позже поймать TypeError . callable удален в Python 3.0 и 3.1, используйте callable = lambda o: hasattr(o, ‘__call__’) или isinstance(o, collections.Callable) .

Источник

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