Python中的__call__

本文详细介绍了Python中__call__魔术方法的使用,通过两个实例展示了如何使类实例像函数一样被调用,包括改变实体位置和记录函数调用次数的应用场景。

双下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

首先这里的@Counter是装饰器,执行起来顺序是 foo = Counter(foo), 实例化,把foo函数传到类Counter里面,并存到对象属性里面,然后返回foo = Counter实例。 这时foo已经是Counter实例,而不是本身foo函数。 当执行foo()的时候,其实已经变成了,执行call函数,而这个函数里面是执行了本身的self.func 即foo的实际逻辑, 而且加上了计算调用次数。这样就记录状态了。

转载于:https://www.cnblogs.com/zzy-9318/p/10180372.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值