亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python之如何實(shí)現(xiàn)延遲操作

 更新時(shí)間:2023年04月28日 16:40:54   作者:胡小牧  
這篇文章主要介紹了python之如何實(shí)現(xiàn)延遲操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python實(shí)現(xiàn)延遲操作

python 想實(shí)現(xiàn)延遲的操作是需要應(yīng)用time ,然后在使用time的sleep 方法

比如我想寫(xiě)一個(gè)延遲1秒打印一次的操作

import time
for i in range(0, 10):
    time.sleep(1)
    print(i)

Python延遲加載問(wèn)題

Python里面的延遲加載用得非常多,其主要思想是延遲所要引入類(lèi)的實(shí)例化,節(jié)省一些初始化所需要的時(shí)間和空間。

這種思想在Django中應(yīng)用得也是非常廣泛,比如ORM的QuerySet,還有鑒權(quán)中間件中的request.user等等,這些都是利用了延遲加載的思想。

本文就是通過(guò)例子來(lái)分析延遲加載的思想。

實(shí)現(xiàn)延遲加載的基本思路是我創(chuàng)建一個(gè)類(lèi),我們將我們需要實(shí)例化的類(lèi)傳給他,這時(shí)該類(lèi)都會(huì)變成一個(gè)延遲加載類(lèi),在應(yīng)用的時(shí)候,雖然我實(shí)例化了這個(gè)延遲加載類(lèi),但是我們要引用的類(lèi)就沒(méi)有實(shí)例化。

就像下面這樣: 

class User(object):
?? ?def __init__(self):
?? ??? ?self.name = 'haibo'
?? ??? ?self.age = 23
def test():
?? ?return User()
#初始化該延遲加載類(lèi)
user = CommonLazyObject(lambda :test())
#此時(shí)我們要引用的類(lèi)才執(zhí)行
user.age = 28

上面我定義了一個(gè)User類(lèi),它是我們?cè)诔绦蛑幸玫念?lèi),CommonLazyObject是我們定義的延遲加載類(lèi)(后面再說(shuō))。通過(guò)延遲加載類(lèi),我們不必要提前初始化它,只有我們想進(jìn)行如下面的user.age的操作的時(shí)候,才會(huì)進(jìn)行實(shí)例化。

好,下面看一下延遲加載類(lèi)的具體實(shí)現(xiàn)過(guò)程。

思想:我們對(duì)于一個(gè)實(shí)例化的操作,無(wú)非最終會(huì)歸結(jié)為_(kāi)_getattr__,__setattr__等運(yùn)算符,因此只要我們定義好這些運(yùn)算符就可以實(shí)現(xiàn)這些延遲,即只有執(zhí)行這些操作的時(shí)候,才去真正實(shí)例化我們想要實(shí)例化的類(lèi):        

#建立一個(gè)空的對(duì)象
empty = object()
#一個(gè)裝飾器,對(duì)__getattr__進(jìn)行裝飾,使得其可以進(jìn)行類(lèi)的實(shí)例化
def proxy_getattr(func):
?? ?def wrapper(self,*args):
?? ??? ?if self._wrapper is empty:
?? ??? ??? ?self._init_object()
?? ??? ?return func(self._wrapper,*args)
?? ?return wrapper
class LazyObject(object):
?? ?def __init__(self):
?? ??? ?self._wrapper = empty
?? ?__getattr__ = proxy_getattr(getattr)
? ? ? ? #進(jìn)行賦值操作的時(shí)候,看是實(shí)例化類(lèi),還是對(duì)類(lèi)的實(shí)例進(jìn)行賦值操作。因?yàn)橄旅嫖覀円M(jìn)行實(shí)例化類(lèi)的操作。
?? ?def __setattr__(self, key, value):
?? ??? ?if key == '_wrapper':
?? ??? ??? ?self.__dict__['_wrapper'] = value
?? ??? ?else:
?? ??? ??? ?if self._wrapper is empty:
?? ??? ??? ??? ?self._init_object()
?? ??? ??? ?setattr(self._wrapper,key,value)
? ? ? ? #在子類(lèi)中,你應(yīng)該重新定義它,你通過(guò)它,來(lái)實(shí)現(xiàn)你想要通過(guò)何種方式實(shí)例化你的類(lèi)。
?? ?def _init_object(self):
?? ??? ?pass

先看上面的__setattr__,當(dāng)我們執(zhí)行user.age=28的賦值操作的時(shí)候,就會(huì)調(diào)用該運(yùn)算符,如果該延遲類(lèi)中并沒(méi)有實(shí)例化我們要引入的類(lèi),就會(huì)先進(jìn)行實(shí)例化,即調(diào)用self._init_object,并賦值給_wrapper。如果已經(jīng)實(shí)例化好了,就會(huì)直接進(jìn)行這個(gè)實(shí)例的__setattr__。       

同理,__getattr_也是一個(gè)道理,我想print user.name ,首先要檢查引用的類(lèi)是否已經(jīng)實(shí)例化,如果沒(méi)有實(shí)例化就先實(shí)例化,然后再調(diào)用該實(shí)例的__getattr__。

好,再看一個(gè)實(shí)現(xiàn)實(shí)例化的子類(lèi): 

class CommonLazyObject(LazyObject):
?? ?def __init__(self,func):
?? ??? ?self.__dict__['_wrapperfunc'] = func
?? ??? ?super(CommonLazyObject,self).__init__()
?? ?def _init_object(self):
?? ??? ?self._wrapper = self._wrapperfunc()

這個(gè)子類(lèi)實(shí)例化的過(guò)程很簡(jiǎn)單,就直接調(diào)用了。

OK!上面就介紹了延遲加載的思想以及創(chuàng)建過(guò)程??赡?,我說(shuō)的是最基本的實(shí)現(xiàn)方法,但也是Django中經(jīng)常用的。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用python爬取抖音視頻列表信息

    使用python爬取抖音視頻列表信息

    這篇文章主要介紹了如何用python爬取抖音視頻列表信息,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 教你用Python3+mysql8.0搭建Django框架

    教你用Python3+mysql8.0搭建Django框架

    發(fā)現(xiàn)有很多小伙伴還不知道如何搭建Django框架,今天特地整理了本篇文章,基于Python3和mysql8.0,文中有非常詳細(xì)的步驟教程,對(duì)小伙伴很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python?pandas找出、刪除重復(fù)的數(shù)據(jù)實(shí)例

    Python?pandas找出、刪除重復(fù)的數(shù)據(jù)實(shí)例

    在面試中很可能遇到給定一個(gè)含有重復(fù)元素的列表,刪除其中重復(fù)的元素,下面這篇文章主要給大家介紹了關(guān)于Python?pandas找出、刪除重復(fù)數(shù)據(jù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • keras CNN卷積核可視化,熱度圖教程

    keras CNN卷積核可視化,熱度圖教程

    這篇文章主要介紹了keras CNN卷積核可視化,熱度圖教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python中atexit模塊的基本使用示例

    Python中atexit模塊的基本使用示例

    這篇文章主要介紹了Python中atexit模塊的基本使用示例,示例代碼基于Python2.x版本,注意其和Python3的兼容性,需要的朋友可以參考下
    2015-07-07
  • 基于DataFrame改變列類(lèi)型的方法

    基于DataFrame改變列類(lèi)型的方法

    今天小編就為大家分享一篇基于DataFrame改變列類(lèi)型的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Python模塊域名dnspython解析

    Python模塊域名dnspython解析

    本文主要介紹了Python模塊域名dnspython解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • python使用Tesseract庫(kù)識(shí)別驗(yàn)證

    python使用Tesseract庫(kù)識(shí)別驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了python使用Tesseract庫(kù)識(shí)別驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python  unittest單元測(cè)試框架的使用

    Python unittest單元測(cè)試框架的使用

    這篇文章主要介紹了Python unittest單元測(cè)試框架的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Python用sndhdr模塊識(shí)別音頻格式詳解

    Python用sndhdr模塊識(shí)別音頻格式詳解

    這篇文章主要介紹了Python用sndhdr模塊識(shí)別音頻格式詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01

最新評(píng)論