摘要:今天看文章看到一個很神奇的東西,那就是文章之主題。中的符裝飾被裝飾了。。。當第一次執行的時候先被類初始化并賦給其實例變量然后再被函數執行并將返回值賦給變量,被通過內置函數將屬性加入實例中,最后返回。
今天看文章看到一個很神奇的東西,那就是文章之主題——lazy property。自己也百度了好幾篇文章,琢磨了一會兒才明白其中之奧秘,分享給大家。
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的返回值,也就是其內部函數inner,然后調用a,其實調用的是被裝飾后的函數。那么接下來,引入我們今天的話題lazy property.
class lazy(object): def __init__(self, func): self.func = func def __get__(self, instance, cls): val = self.func(instance) #其相當于執行的area(c),c為下面的Circle對象 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) #三次的結果都是:50.24
上面的代碼引用自飄逸的python,其不僅用到了我們上面的@符作用,更是用到了昨天講的屬性描述器。當第一次執行的時候先被lazy類初始化并賦給其實例變量func,然后再被__get__函數執行并將返回值賦給變量val,被通過python內置函數setter()將area屬性加入c實例中(c.__dict__),最后返回val。這種方式可以簡化我們的計算操作。
最后給大家擴展一個小知識點(見名之意我就不多嘴了):
setter(object,name,value)
getter(object,name, not_exists_value)
hasattr(object,name)
只想踏踏實實的學好一門語言,有不足的地方,大家多多留言提出來,謝謝了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42769.html
摘要:延遲初始化主要用于提高性能,避免浪費計算,并減少程序的內存需求。實現延遲初始化有兩種方式,一種是使用描述符,另一種是使用修飾符。 Python 對象的延遲初始化是指,當它第一次被創建時才進行初始化,或者保存第一次創建的結果,然后每次調用的時候直接返回該結果。 延遲初始化主要用于提高性能,避免浪費計算,并減少程序的內存需求。 property 在切入正題之前,我們了解下property的...
摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當不需要這個屬性時就能避免進行無意義的計算,同時又能阻止該屬性重復進行計算。 起步 我們希望將一個只讀的屬性定義為 property 屬性方法,只有在訪問它時才進行計算,但是,又希望把計算出的值緩存起來,不要每次訪問它時都重...
摘要:并在內執行了函數,在函數內部,訪問了。至此知道了它依賴于。需要根據最新的計算。本例中收集到了依賴并且也被告知觀察了他們。文章鏈接源碼分析系列源碼分析系列之環境搭建源碼分析系列之入口文件分析源碼分析系列之響應式數據一源碼分析系列之響應式數據二 前言 上一節著重講述了initData中的代碼,以及數據是如何從data中到視圖層的,以及data修改后如何作用于視圖。這一節主要記錄initCo...
摘要:非集合屬性非集合屬性的延遲加載相對比較復雜。僅通過注解是無法實現延遲加載的。但是在一對一關系中,延遲加載是有陷阱的。這樣一來,就會立即為配置延遲加載的實體生成一個動態代理類。 Hibernate中,延遲加載針對屬性類別可以分為兩類,一類是延遲屬性加載,另一類是延遲關聯實體加載。 屬性延遲加載 屬性有可以分為兩種類型:一種是集合屬性,一種是非集合屬性(如String、Integer……)...
摘要:分析是如何實現數據響應的前記現在回顧一下看數據響應的原因之前看了和的源碼他們都有自己內部的也就是實例使用的都是的響應式數據特性及所以決定看一下的源碼了解是如何實現響應式數據本文敘事方式為樹藤摸瓜順著看源碼的邏輯走一遍查看的的版本為目的明確 分析vue是如何實現數據響應的. 前記 現在回顧一下看數據響應的原因. 之前看了vuex和vue-i18n的源碼, 他們都有自己內部的vm, 也就是...
閱讀 2948·2023-04-26 01:52
閱讀 3475·2021-09-04 16:40
閱讀 3633·2021-08-31 09:41
閱讀 1767·2021-08-09 13:41
閱讀 567·2019-08-30 15:54
閱讀 2967·2019-08-30 11:22
閱讀 1619·2019-08-30 10:52
閱讀 953·2019-08-29 13:24