Ответ 1
Вы ищете метод __call__
. Объекты функции имеют этот метод:
>>> def foo(): pass
...
>>> foo.__call__
<method-wrapper '__call__' of function object at 0x106aafd70>
Не то, чтобы цикл интерпретатора Python фактически использовал этот метод, когда сталкивался с объектом функции Python; оптимизация в реализации в большинстве случаев переходит прямо к содержащемуся байт-коду.
Но вы можете использовать это в своем собственном классе:
class Callable(object):
def __init__(self, name):
self.name = name
def __call__(self, greeting):
return '{}, {}!'.format(greeting, self.name)
Демо:
>>> class Callable(object):
... def __init__(self, name):
... self.name = name
... def __call__(self, greeting):
... return '{}, {}!'.format(greeting, self.name)
...
>>> Callable('World')('Hello')
'Hello, World!'
Python создает объекты для вас, когда вы используете оператор def
или используете lambda
выражение:
>>> def foo(): pass
...
>>> foo
<function foo at 0x106aafd70>
>>> lambda: None
<function <lambda> at 0x106d90668>
Вы можете сравнить это с созданием строки или целого числа или списка с использованием синтаксиса literal:
listobject = [1, 'two']
Вышеописанное создает 3 объекта без вызова типа, Python сделал это все для вас на основе используемого синтаксиса. То же самое относится к функциям.
Создание одного может быть немного сложнее; вам нужно иметь объект кода и ссылку на глобальное пространство имен, по крайней мере:
>>> function_type = type(lambda: None)
>>> function_type
<type 'function'>
>>> function_type(foo.__code__, globals(), 'bar')
<function bar at 0x106d906e0>
Здесь я создал объект функции, повторно используя тип function
, взяв объект кода из функции foo
; тип функции не является встроенным именем, но тип действительно существует и может быть получен путем вызова type()
в существующем экземпляре функции.
Я также передал в глобальном пространстве имен моего интерпретатора и имя; последний является необязательным аргументом; имя иначе берется из объекта кода.