亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python之lazy property

SoapEye / 2390人閱讀

摘要:今天看文章看到一個(gè)很神奇的東西,那就是文章之主題。中的符裝飾被裝飾了。。。當(dāng)?shù)谝淮螆?zhí)行的時(shí)候先被類初始化并賦給其實(shí)例變量然后再被函數(shù)執(zhí)行并將返回值賦給變量,被通過內(nèi)置函數(shù)將屬性加入實(shí)例中,最后返回。

今天看文章看到一個(gè)很神奇的東西,那就是文章之主題——lazy property。自己也百度了好幾篇文章,琢磨了一會(huì)兒才明白其中之奧秘,分享給大家。
python中的@符

def outter(func):
    def inner(*args, **kwargs):
        print("裝飾a....")
        re=func(*args, **kwargs)
        return re   

    return inner
@outter
def a():
    print("被裝飾了。。。")

a()

上面一段裝飾器的代碼,相信大家都明白其原理,通過裝飾器a指向了outter的返回值,也就是其內(nèi)部函數(shù)inner,然后調(diào)用a,其實(shí)調(diào)用的是被裝飾后的函數(shù)。那么接下來,引入我們今天的話題lazy property.

class lazy(object):
    def __init__(self, func):
        self.func = func
 
    def __get__(self, instance, cls):
        val = self.func(instance)    #其相當(dāng)于執(zhí)行的area(c),c為下面的Circle對(duì)象
        setattr(instance, self.func.__name__, val)
        return val
 
class Circle(object):
    def __init__(self, radius):
        self.radius = radius
 
    @lazy
    def area(self):
        print("evalute")
        return 3.14 * self.radius ** 2
 
c = Circle(4)
print(c.area)
print(c.area)
print(c.area)   #三次的結(jié)果都是:50.24

上面的代碼引用自飄逸的python,其不僅用到了我們上面的@符作用,更是用到了昨天講的屬性描述器。當(dāng)?shù)谝淮螆?zhí)行的時(shí)候先被lazy類初始化并賦給其實(shí)例變量func,然后再被__get__函數(shù)執(zhí)行并將返回值賦給變量val,被通過python內(nèi)置函數(shù)setter()將area屬性加入c實(shí)例中(c.__dict__),最后返回val。這種方式可以簡化我們的計(jì)算操作。
最后給大家擴(kuò)展一個(gè)小知識(shí)點(diǎn)(見名之意我就不多嘴了):
setter(object,name,value)
getter(object,name, not_exists_value)
hasattr(object,name)
只想踏踏實(shí)實(shí)的學(xué)好一門語言,有不足的地方,大家多多留言提出來,謝謝了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/42769.html

相關(guān)文章

  • Python 延遲初始化(lazy property

    摘要:延遲初始化主要用于提高性能,避免浪費(fèi)計(jì)算,并減少程序的內(nèi)存需求。實(shí)現(xiàn)延遲初始化有兩種方式,一種是使用描述符,另一種是使用修飾符。 Python 對(duì)象的延遲初始化是指,當(dāng)它第一次被創(chuàng)建時(shí)才進(jìn)行初始化,或者保存第一次創(chuàng)建的結(jié)果,然后每次調(diào)用的時(shí)候直接返回該結(jié)果。 延遲初始化主要用于提高性能,避免浪費(fèi)計(jì)算,并減少程序的內(nèi)存需求。 property 在切入正題之前,我們了解下property的...

    J4ck_Chan 評(píng)論0 收藏0
  • Python中類的屬性具有惰性求值的能力

    摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會(huì)使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當(dāng)不需要這個(gè)屬性時(shí)就能避免進(jìn)行無意義的計(jì)算,同時(shí)又能阻止該屬性重復(fù)進(jìn)行計(jì)算。 起步 我們希望將一個(gè)只讀的屬性定義為 property 屬性方法,只有在訪問它時(shí)才進(jìn)行計(jì)算,但是,又希望把計(jì)算出的值緩存起來,不要每次訪問它時(shí)都重...

    NervosNetwork 評(píng)論0 收藏0
  • vue源碼分析系列響應(yīng)式數(shù)據(jù)(三)

    摘要:并在內(nèi)執(zhí)行了函數(shù),在函數(shù)內(nèi)部,訪問了。至此知道了它依賴于。需要根據(jù)最新的計(jì)算。本例中收集到了依賴并且也被告知觀察了他們。文章鏈接源碼分析系列源碼分析系列之環(huán)境搭建源碼分析系列之入口文件分析源碼分析系列之響應(yīng)式數(shù)據(jù)一源碼分析系列之響應(yīng)式數(shù)據(jù)二 前言 上一節(jié)著重講述了initData中的代碼,以及數(shù)據(jù)是如何從data中到視圖層的,以及data修改后如何作用于視圖。這一節(jié)主要記錄initCo...

    shenhualong 評(píng)論0 收藏0
  • Hibernate的延遲加載

    摘要:非集合屬性非集合屬性的延遲加載相對(duì)比較復(fù)雜。僅通過注解是無法實(shí)現(xiàn)延遲加載的。但是在一對(duì)一關(guān)系中,延遲加載是有陷阱的。這樣一來,就會(huì)立即為配置延遲加載的實(shí)體生成一個(gè)動(dòng)態(tài)代理類。 Hibernate中,延遲加載針對(duì)屬性類別可以分為兩類,一類是延遲屬性加載,另一類是延遲關(guān)聯(lián)實(shí)體加載。 屬性延遲加載 屬性有可以分為兩種類型:一種是集合屬性,一種是非集合屬性(如String、Integer……)...

    jollywing 評(píng)論0 收藏0
  • vue源碼響應(yīng)式數(shù)據(jù)

    摘要:分析是如何實(shí)現(xiàn)數(shù)據(jù)響應(yīng)的前記現(xiàn)在回顧一下看數(shù)據(jù)響應(yīng)的原因之前看了和的源碼他們都有自己內(nèi)部的也就是實(shí)例使用的都是的響應(yīng)式數(shù)據(jù)特性及所以決定看一下的源碼了解是如何實(shí)現(xiàn)響應(yīng)式數(shù)據(jù)本文敘事方式為樹藤摸瓜順著看源碼的邏輯走一遍查看的的版本為目的明確 分析vue是如何實(shí)現(xiàn)數(shù)據(jù)響應(yīng)的. 前記 現(xiàn)在回顧一下看數(shù)據(jù)響應(yīng)的原因. 之前看了vuex和vue-i18n的源碼, 他們都有自己內(nèi)部的vm, 也就是...

    learn_shifeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<