持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
0 环境
- 编辑器:pycharm或者vscode
- 系统版本:windows10
- python版本:3.9.6
1 了解
现在很多封装好的API,直接调用得到结果很方便,需要稍微了解一下它是怎么实现的,方便以后借鉴学习,少写代码。
2 可调用对象
我们经常定义使用函数,别说你用不到,大概率是你没学到这里,或是只是写写小demo这类的,用不到函数,一旦做项目了,总会遇到重复写一些代码的情况,总不能一直这样复制粘贴吧。函数定义如下图:
再看看函数的class,得到的结果是function。
我们都知道是这么调用的,也知道调用__class__的结果,那么怎么做的呢,通过小括号来调用对象呢,这里就要说到callable对象。
3 call
当一个对象实现__call__这个方法,就可以视它为可调用对象,特点就是可以通过小括号调用。如下代码:
class Demo:
def __call__(self):
print(f'调用 --> {self}')
d = Demo()
d()
如下图,是不是看着有点装饰器的味道了。
怎么确定它是否可以被调用呢,可以通过callable来判断True还是Fasle。
4 应用
之前写过坐标点相加的,先要做__add__处理,让后在整两个实例出来,然后在相加,是不是挺繁琐的,但是我用__call__方法就会很方便,直接相加返回,是不是很舒服。我初始化x和y,
class SumDemo:
def __init__(self, x, y):
self.x = x
self.y = y
def __call__(self, a, b):
return (self.x + a, self.y + b)
print(SumDemo(1, 2)(3, 4))
5 总结
call的好处,解决了我们保存一些状态(闭包)或者一些必要的功能处理(有种类似装饰器的赶脚,复杂的装饰器可以用它来拆分哦,实例化就可以调用了,很方便),比如不要纠结类后面加两个括号,第一个括号用来实例化的,后面括号的值,传参给call的。不理解也没影响,def就够用,这里只当了解。