python怎样做链式调用?有啥好处?
Admin 2021-05-22 群英技术资讯 1350 次浏览
python链式调用如何实现?关于链式调用也就是调用完一个函数后还能再继续调用其它函数,这样的好处就是大大减少了代码量。那么在Python中如何实现链式调用呢?下面给大家分享一下实现方法。
我们在使用Django的models查询数据库时,可以看到有这种写法:
form app.models import XXX query = XXX.objects.all() query = query.filter(name=123, age=456).filter(salary=999)
在这种写法里面,query对象有一个filter方法,这个方法的返回数据还可以继续调用filter方法,可以这样无限制地调用下去。
这种写法是怎么实现的呢?
如果我们直接写一个类的方法,看看能不能这样调用:
class Query: def filter(self): pass query = Query() query.filter().filter()

直接对query.filter()返回的结果再调用一次filter,就会导致报错了。这是因为在没有显式写return语句的时候,方法会返回None,而None对象是没有所谓的filter方法的。
那么什么东西有filter方法呢?显然我们的query对象有filter方法。那么如何让这个方法返回自身这个对象呢?
这个时候,我们就要看看我们在定义类方法的时候,总会写的的第一个参数self了。几乎每个类方法里面都会有它。大家只知道在类里面调用类方法的时候可以用self.xxx(),在调用类属性的时候可以用self.yy,那么有没有思考过,这个东西如果单独使用会怎么样呢?
实际上,self指的就是这个类实例化成一个对象以后,这个对象自身。而这个对象显然是有filter方法的。所以我们修改一下filter方法,让它返回self:
class Query: def filter(self): return self query = Query() query.filter().filter()

从图中可以看出,现在已经不会报错了。那么回到最开始的问题,Django里面的链式调用传入查询参数是如何实现的呢?
实际上这里涉及到一个惰性查询的问题。
当我们不停调用.filter()方法的时候,Django会把这些查询条件全部缓存起来,只有当我们需要获取结果,或者查询满足条件的数据有多少条时,它才会真正地连接数据库去查询。
所以我们这里要模拟这个环境,把查询条件缓存起来。
那么为了获取调用方法时传入的参数名,我们就要使用**kwargs参数。这个参数可以接受所有的key=value形式的参数:
class Query():
def __init__(self):
self.query_condition = {}
def filter(self, **kwargs):
self.query_condition.update(kwargs)
return self
query = Query()
a = query.filter(name='kingname').filter(age__gt=15, address='yyyyyy').filter(salary=99999)
print(query.query_condition)
运行效果如下图所示:

在真正需要输出结果的时候,再使用这些缓存的条件,去数据库中查询结果即可。
以上就是关于python实现链式调用的介绍了,现在大家对于python链式调用应该也有所了解了,上述示例有一定的借鉴价值,有需要的朋友可以参考学习,希望本文对大家有帮助。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
在python中,有些需求需要我们去除指定字符,那么如果想要去除头尾的指定字符,有什么办法呢?下面给大家介绍三个函数,strip()、lstrip()、rstrip()。
这篇文章主要介绍了python基于Pandas读写MySQL数据库,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
%r用rper()方法处理对象%s用str()方法处理对象函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式(如果没有
这篇文章给大家分享的是有关使用python写一个文件名批量重命名脚本的内容。小编觉得挺实用的,因此分享给大家做个参考,感兴趣的朋友就一起跟随小编看看吧。
栈实现进制转换的Python和C语义代码怎样写?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008