• 用Python实现链式调用


    嗨喽,大家好呀~这里是爱看美女的茜茜呐

    我们在使用Django的models查询数据库时,可以看到有这种写法:

    form app.models import XXX
    query = XXX.objects.all()
    query = query.filter(name=123, age=456).filter(salary=999)
    
    • 1
    • 2
    • 3

    在这种写法里面,query对象有一个filter方法,这个方法的返回数据还可以继续调用filter方法,可以这样无限制地调用下去。


    👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~

    python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可


    这种写法是怎么实现的呢?

    如果我们直接写一个类的方法,看看能不能这样调用:

    class Query:
        def filter(self):
            pass
    
    query = Query()
    query.filter().filter()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    直接对query.filter()返回的结果再调用一次filter,就会导致报错了。

    这是因为在没有显式写return语句的时候,方法会返回None,而None对象是没有所谓的filter方法的。

    那么什么东西有filter方法呢?

    显然我们的query对象有filter方法。

    那么如何让这个方法返回自身这个对象呢?

    这个时候,我们就要看看我们在定义类方法的时候,总会写的的第一个参数self了。

    几乎每个类方法里面都会有它。

    大家只知道在类里面调用类方法的时候可以用self.xxx(),在调用类属性的时候可以用self.yy,

    那么有没有思考过,这个东西如果单独使用会怎么样呢?

    实际上,self指的就是这个类实例化成一个对象以后,这个对象自身。

    而这个对象显然是有filter方法的。

    所以我们修改一下filter方法,让它返回self:

    '''
    python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
    即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
    '''
    class Query:
        def filter(self):
            return self
    
    query = Query()
    query.filter().filter()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    从图中可以看出,现在已经不会报错了。

    那么回到最开始的问题,Django里面的链式调用传入查询参数是如何实现的呢?

    实际上这里涉及到一个惰性查询的问题。

    当我们不停调用.filter()方法的时候,Django会把这些查询条件全部缓存起来,只有当我们需要获取结果,或者查询满足条件的数据有多少条时,它才会真正地连接数据库去查询。

    所以我们这里要模拟这个环境,把查询条件缓存起来。

    那么为了获取调用方法时传入的参数名,我们就要使用**kwargs参数。

    这个参数可以接受所有的key=value形式的参数:

    '''
    python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
    即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
    '''
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    运行效果如下图所示:

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

    尾语

    感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

    希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

    躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

    最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

  • 相关阅读:
    Android设计模式--状态模式
    java中对象和类应用实例
    设计模式(9) 观察者模式
    安装Keras,tensorflow,并将虚拟环境添加到jupyter notebook
    Web前端:Web 项目的前14个React图表库
    微软Ignite 2023大盘点:GPT-4 Turbo、DALL-E 3等
    FAM DBCO, 6-isomer,DBCO-羧基荧光素琥珀酰亚胺酯-6-异构体
    C语言从头学16——数据类型(二)
    vue.config 同时配置 chainWebpack和关闭eslint检查多个配置项目共存
    IDEA的Git操作——拉取、对比开发代码
  • 原文地址:https://blog.csdn.net/m0_72282564/article/details/134267868