Python语言技能学习之在Python里面实现链式调用
小职 2021-03-17 来源 :未闻Code 阅读 452 评论 0

摘要:本文主要介绍了Python语言技能学习之在Python里面实现链式调用,通过具体的内容向大家展现,希望对大家Python语言的学习有所帮助。

本文主要介绍了Python语言技能学习之在Python里面实现链式调用,通过具体的内容向大家展现,希望对大家Python语言的学习有所帮助。

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

 Python语言技能学习之在Python里面实现链式调用

 

直接对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()

 Python语言技能学习之在Python里面实现链式调用

 

从图中可以看出,现在已经不会报错了。那么回到最开始的问题,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里面实现链式调用

 

 

在真正需要输出结果的时候,再使用这些缓存的条件,去数据库中查询结果即可。


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取学习教程,开发工具,代码大全,参考书籍

Python语言技能学习之在Python里面实现链式调用

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程