все Python 3Функциипонятие
Вызываемые объекты __call__
callable
Объект с методом __call__ можно вызывать как функцию. Используется для stateful callable, декораторов-классов.
Синтаксис
class F:
def __call__(self, x): ...
f = F()
f(10)
Класс с __call__ — альтернатива замыканию, когда состояние удобнее держать в атрибутах: его видно, можно менять и добавлять вспомогательные методы (reset, __repr__), тогда как в замыкании оно спрятано. Проверить, вызываем ли объект, можно встроенной callable(obj); кстати, обычные функции — тоже объекты с методом __call__.
Примеры
class Adder:
def __init__(self, n):
self.n = n
def __call__(self, x):
return x + self.n
add5 = Adder(5)
print(add5(3)) # → 8
class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
return self.count
c = Counter()
print(c(), c(), c()) # → 1 2 3
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, x):
return x * self.factor
double = Multiplier(2)
print(list(map(double, [1,2,3,4]))) # → [2,4,6,8]
print(callable(double)) # → True
print(callable(42)) # → False
class Logger:
def __init__(self, func):
self.func = func
self.calls = 0
def __call__(self, *a, **kw):
self.calls += 1
return self.func(*a, **kw)
def add(a,b): return a+b
logged_add = Logger(add)
print(logged_add(1,2)) # → 3
print(logged_add.calls) # → 1
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности