Python Glossary English

все 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Сообщить о неточности