欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中如何實現(xiàn)鏈?zhǔn)秸{(diào)用

 更新時間:2021年03月25日 14:31:32   作者:kingname  
這篇文章主要介紹了python中如何實現(xiàn)鏈?zhǔn)秸{(diào)用,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下

我們在使用Django的models查詢數(shù)據(jù)庫時,可以看到有這種寫法:

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

在這種寫法里面,query對象有一個filter方法,這個方法的返回數(shù)據(jù)還可以繼續(xù)調(diào)用filter方法,可以這樣無限制地調(diào)用下去。

這種寫法是怎么實現(xiàn)的呢?

如果我們直接寫一個類的方法,看看能不能這樣調(diào)用:

class Query:
    def filter(self):
        pass

query = Query()
query.filter().filter()

直接對query.filter()返回的結(jié)果再調(diào)用一次filter,就會導(dǎo)致報錯了。這是因為在沒有顯式寫return語句的時候,方法會返回None,而None對象是沒有所謂的filter方法的。

那么什么東西有filter方法呢?顯然我們的query對象有filter方法。那么如何讓這個方法返回自身這個對象呢?

這個時候,我們就要看看我們在定義類方法的時候,總會寫的的第一個參數(shù)self了。幾乎每個類方法里面都會有它。大家只知道在類里面調(diào)用類方法的時候可以用self.xxx(),在調(diào)用類屬性的時候可以用self.yy,那么有沒有思考過,這個東西如果單獨使用會怎么樣呢?

實際上,self指的就是這個類實例化成一個對象以后,這個對象自身。而這個對象顯然是有filter方法的。所以我們修改一下filter方法,讓它返回self:

class Query:
    def filter(self):
        return self

query = Query()
query.filter().filter()

從圖中可以看出,現(xiàn)在已經(jīng)不會報錯了。那么回到最開始的問題,Django里面的鏈?zhǔn)秸{(diào)用傳入查詢參數(shù)是如何實現(xiàn)的呢?

實際上這里涉及到一個惰性查詢的問題。

當(dāng)我們不停調(diào)用.filter()方法的時候,Django會把這些查詢條件全部緩存起來,只有當(dāng)我們需要獲取結(jié)果,或者查詢滿足條件的數(shù)據(jù)有多少條時,它才會真正地連接數(shù)據(jù)庫去查詢。

所以我們這里要模擬這個環(huán)境,把查詢條件緩存起來。

那么為了獲取調(diào)用方法時傳入的參數(shù)名,我們就要使用**kwargs參數(shù)。這個參數(shù)可以接受所有的key=value形式的參數(shù):

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)

運行效果如下圖所示:

在真正需要輸出結(jié)果的時候,再使用這些緩存的條件,去數(shù)據(jù)庫中查詢結(jié)果即可。

以上就是python中如何實現(xiàn)鏈?zhǔn)秸{(diào)用的詳細(xì)內(nèi)容,更多關(guān)于python 實現(xiàn)鏈?zhǔn)秸{(diào)用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Django xadmin 實現(xiàn)修改時間選擇器為不可輸入狀態(tài)

    使用Django xadmin 實現(xiàn)修改時間選擇器為不可輸入狀態(tài)

    這篇文章主要介紹了使用Django xadmin 實現(xiàn)修改時間選擇器為不可輸入狀態(tài),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 圖文詳解寶塔centos7安裝Conda的步驟

    圖文詳解寶塔centos7安裝Conda的步驟

    在centos7上安裝anaconda碰到很多的坑,分享出來,也免得以后自己忘記,下面這篇文章主要給大家介紹了關(guān)于寶塔centos7安裝Conda的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Python requests HTTP驗證登錄實現(xiàn)流程

    Python requests HTTP驗證登錄實現(xiàn)流程

    這篇文章主要介紹了Python requests HTTP驗證登錄實現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 詳解Python流程控制語句

    詳解Python流程控制語句

    這篇文章主要介紹了Python流程控制語句的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-10-10
  • Python Pandas中根據(jù)列的值選取多行數(shù)據(jù)

    Python Pandas中根據(jù)列的值選取多行數(shù)據(jù)

    這篇文章主要介紹了Python Pandas中根據(jù)列的值選取多行數(shù)據(jù)的實例代碼,本文通過實例代碼給大家介紹的非常詳細(xì) ,需要的朋友可以參考下
    2019-07-07
  • Python爬蟲小技巧之偽造隨機(jī)的User-Agent

    Python爬蟲小技巧之偽造隨機(jī)的User-Agent

    這篇文章主要給大家介紹了關(guān)于Python爬蟲小技巧之偽造隨機(jī)的User-Agent的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Python中利用LSTM模型進(jìn)行時間序列預(yù)測分析的實現(xiàn)

    Python中利用LSTM模型進(jìn)行時間序列預(yù)測分析的實現(xiàn)

    這篇文章主要介紹了Python中利用LSTM模型進(jìn)行時間序列預(yù)測分析的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python創(chuàng)建文本文件的簡單方法

    python創(chuàng)建文本文件的簡單方法

    在本篇內(nèi)容里小編給大家整理分享的是一篇關(guān)于python創(chuàng)建文本文件的簡單方法,有需要的朋友們可以參考學(xué)習(xí)下。
    2020-08-08
  • Pandas?時間序列分析中的resample函數(shù)

    Pandas?時間序列分析中的resample函數(shù)

    這篇文章主要介紹了Pandas?時間序列分析中的resample函數(shù),Pandas?中的resample函數(shù)用于各種頻率的轉(zhuǎn)換工作,下面我們就來看看其的參數(shù)、相關(guān)資料等,需要的小伙伴可以參考一下,希望給你帶來幫助
    2022-02-02
  • Python 專題一 函數(shù)的基礎(chǔ)知識

    Python 專題一 函數(shù)的基礎(chǔ)知識

    本文從系統(tǒng)提供的內(nèi)部函數(shù)、第三方提供函數(shù)庫+簡單爬出代碼及安裝httplib2模塊過程和用戶自定函數(shù)三個方面進(jìn)行講述。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03

最新評論