python笔记 callable

73 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 了解

现在很多封装好的API,直接调用得到结果很方便,需要稍微了解一下它是怎么实现的,方便以后借鉴学习,少写代码。

2 可调用对象

我们经常定义使用函数,别说你用不到,大概率是你没学到这里,或是只是写写小demo这类的,用不到函数,一旦做项目了,总会遇到重复写一些代码的情况,总不能一直这样复制粘贴吧。函数定义如下图:

image.png

再看看函数的class,得到的结果是function。 image.png

我们都知道是这么调用的,也知道调用__class__的结果,那么怎么做的呢,通过小括号来调用对象呢,这里就要说到callable对象。

3 call

当一个对象实现__call__这个方法,就可以视它为可调用对象,特点就是可以通过小括号调用。如下代码:

class Demo:
    def __call__(self):
        print(f'调用 --> {self}')

d = Demo()
d()

如下图,是不是看着有点装饰器的味道了。

image.png

怎么确定它是否可以被调用呢,可以通过callable来判断True还是Fasle。 image.png

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))

image.png

5 总结

call的好处,解决了我们保存一些状态(闭包)或者一些必要的功能处理(有种类似装饰器的赶脚,复杂的装饰器可以用它来拆分哦,实例化就可以调用了,很方便),比如不要纠结类后面加两个括号,第一个括号用来实例化的,后面括号的值,传参给call的。不理解也没影响,def就够用,这里只当了解。