【python】可调用对象和__call__()

一、可调用对象
如果一个对象可以在后面加()并执行(可以传入参数,也可以不传入参数),就认为该对象可以被调用,或者称这个对象为可调用对象。可以采用callable()方法判断一个对象是不是可调用对象,返回布尔值。

python中的可调用对象有:函数、方法、类、类的实例

二、对象的调用过程
函数和方法的调用不多说。
类后面加()表示实例化生成一个实例,在实例化的过程中,会先调用__new__()方法创建一个实例对象,然后调用__init__()初始化该实例。__new__方法其实平常很少能接触到,一般在定义元类的时候会用到。元类是类的模板,和type是一级的(不知道说的对不对)。 __init__大家都比较熟悉,其对实例进行初始化。
对实例来说,并不是所有的实例对象都是可调用对象,必须要该实例存在__call__才能可以被调用。对实例x来说,x(args)等价于x.__call __(args) 。如下图所示,hello()()等价于hello().__call __(),返回10。
实例的调用
在这里插入图片描述
三,__call__的应用

实例的调用有什么用呢?我们先看下面的代码。
实例调用代码
定义一个类Decorator,其含有__call__,也就是说其实例是可调用的。调用实例 Decorator(func)(args)就相当于Decorator(func).call(args),我们看下其和 func(args)的区别在哪里,只是在func运行前和运行后分别打印一次。
我们看下的hello()的例子,运行一下,结果确实如此。
运行结果
这是不是相当于我们可以在函数的基础上定制功能,是不是有点类似装饰器的感觉了。确实是,通过实例的调用可以对函数前后增加功能,而且,我们可以通过实例的属性作为变量来记录一些信息,比如记录函数调用的时间,不能频繁调用;记录函数调用的次数等等。flask里有个叫中间件(Middleware)的东西,其实就是靠这样实现的。

当然,上面说的功能通过装饰器以及装饰器的闭包特性同样可以实现,后面我也会再写下装饰器相关的内容,以及闭包是什么。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值