双下call放法,一个特殊的魔术方法可以让类的实例的行为表现的像函数一样,你可以调用他们,将一个函数当做一个参数传到另外一个函数中等等。这是一个非常强大的特性让Python编程更加舒适甜美。 call(self, [args...])
允许一个类的实例像函数一样被调用。实质上说,这意味着 x() 与 x.call() 是相同的。注意 call 参数可变。这意味着你可以定义 call 为其他你想要的函数,无论有多少个参数。
例子一
# 调用实体来改变实体的位置。 class Entity: def __init__(self, size, x, y): self.x, self.y = x, y self.size = size # 改变实体的位置 def __call__(self, x, y): self.x, self.y = x, y e = Entity(1, 2, 3) # 创建实例 e(4, 5) # 实例可以象函数那样执行,并传入x y值,修改对象的x y
例子二
class Counter: def __init__(self, func): self.func = func self.count = 0 def __call__(self, *args, **kwargs): self.count += 1 return self.func(*args, **kwargs) @Counter def foo(): pass for i in range(10): foo() print(foo.count) # 10