摘要:屬性搜索優先級和定義數據描述符數據描述符非數據描述符一般情況數據型描述符非數據型描述符類調用描述符如果被重寫上面代碼介紹的東西會被覆蓋掉除非函數內部調用否則別這么干例子
屬性搜索優先級和descriptor
######################## # 定義 ######################## # 數據描述符 class DataDesc(object): def __init__(self, *args, **kwargs): pass def __get__(self, instance, cls): print(instance is None) return "DataDesc" def __set__(self, instance, value): return None def __delete__(self, instance): return None # 數據描述符 class DataDesc2(object): def __init__(self, *args, **kwargs): pass def __get__(self, instance, cls): return "DataDesc2" def __set__(self, instance, value): return None # 非數據描述符 class NonDataDesc(object): def __init__(self, *args, **kwargs): pass def __get__(self, instance, cls): print(instance is None) return "NonDataDesc" class Foo(object): test_attr = DataDesc() test_attr2 = DataDesc() test_attr3 = NonDataDesc() test_attr4 = "test_attr4" def __getattr__(self, item): return "hehe__getattr__" ######################## # 一般情況 ######################## foo = Foo() """ 1. foo.__dict__["test_attr4"] 2. for cls in Foo.__mro__: cls.__dict__["test_attr4"] 3. foo.__getattr__("test_attr4") """ print(foo.test_attr4) foo.__dict__["test_attr4"] = 666 print(foo.test_attr4) print(id(foo.test_attr4) == id(foo.__dict__["test_attr4"])) foo.__dict__.pop("test_attr4") print(foo.test_attr4) print(foo.test_attr5) print(foo.__getattr__("test_attr5")) ######################## # 數據型描述符 ######################## foo = Foo() """ 1. type(foo).__dict__["test_attr"].__get__(foo, type(foo)) 2. foo.__dict__["test_attr4"] 3. for cls in Foo.__mro__: cls.__dict__["test_attr4"] 4. foo.__getattr__("test_attr4") """ print(foo.test_attr) foo.__dict__["test_attr"] = 666 print(foo.test_attr) print(id(foo.test_attr) == id(foo.__dict__["test_attr"])) delattr(Foo, "test_attr") print(foo.test_attr) print(id(foo.test_attr) == id(foo.__dict__["test_attr"])) ######################## # 非數據型描述符 ######################## foo = Foo() """ 1. foo.__dict__["test_attr4"] 2. type(foo).__dict__["test_attr"].__get__(foo, type(foo)) 3. for cls in Foo.__mro__: cls.__dict__["test_attr4"] 4. foo.__getattr__("test_attr4") """ print(foo.test_attr3) foo.__dict__["test_attr3"] = 666 print(foo.test_attr3) print(id(foo.test_attr3) == id(foo.__dict__["test_attr3"])) del foo.test_attr3 print(foo.test_attr3) ######################## # 類調用描述符 ######################## """ FOO.__dict__["test_attr"].__get__(None, FOO) """ print(Foo.test_attr2) print(Foo.test_attr3) ######################## # __getattribute__ ######################## """ 如果被重寫,上面代碼介紹的東西會被覆蓋掉 除非函數內部調用object.__getattribute__ 否則別這么干 """ class Foo2(object): test_attr = DataDesc() test_attr2 = DataDesc() test_attr3 = NonDataDesc() test_attr4 = "test_attr4" def __getattribute__(self, item): return "in __getattribute__" foo = Foo2() print(foo.test_attr3) ######################## # 例子 ######################## import time class LazyProperty(object): def __init__(self, func): self.func = func def __get__(self, instance, cls): if instance is not None: val = self.func(instance) setattr(instance, self.func.__name__, val) return val class Foo3(object): @LazyProperty def method(self): time.sleep(5) return 666 foo3 = Foo3() time1 = time.time() print(foo3.method) time2 = time.time() print(time2 - time1) print(foo3.method) print(time.time() - time2)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45184.html
摘要:描述符登場什么是描述符一般來說,描述符是一個具有綁定行為的對象屬性,其屬性的訪問被描述符協議方法覆寫。先看如何用描述符來解決上面邏輯重復的問題。 關于@property裝飾器 在Python中我們使用@property裝飾器來把對函數的調用偽裝成對屬性的訪問。 那么為什么要這樣做呢?因為@property讓我們將自定義的代碼同變量的訪問/設定聯系在了一起,同時為你的類保持一個簡單的訪問...
摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當不需要這個屬性時就能避免進行無意義的計算,同時又能阻止該屬性重復進行計算。 起步 我們希望將一個只讀的屬性定義為 property 屬性方法,只有在訪問它時才進行計算,但是,又希望把計算出的值緩存起來,不要每次訪問它時都重...
摘要:事實上實例的實現方式與上面的實例類似。其次,為了實現確實對屬性的調用順序做出了相應的調整,這些將會的下中介紹。參考資料如何理解的中基于的一些概念上中基于的一些概念下的官方文檔描述符解密的官方文檔 Python 在 2.2 版本中引入了descriptor(描述符)功能,也正是基于這個功能實現了新式類(new-styel class)的對象模型,同時解決了之前版本中經典類 (classi...
摘要:匹配器匹配非常簡單,首先在第一幅圖像中選取一個關鍵點然后依次與第二幅圖像的每個關鍵點進行描述符距離測試,最后返回距離最近的關鍵點對于匹配器,首先我們必須使用創建對象。 Feature Matching Brute-Force匹配器 Brute-Force匹配非常簡單,首先在第一幅圖像中選取一個關鍵點然后依次與第二幅圖像的每個關鍵點進行(描述符)距離測試,最后返回距離最近的關鍵點. 對于...
摘要:的裝飾器中的同樣借鑒了這個語法糖,不過依賴于的方法。等同于也就是說,裝飾器是一個對類進行處理的函數。別名或裝飾器在控制臺顯示一條警告,表示該方法將廢除。有了裝飾器,就可以改寫上面的代碼。 更多文章,請在Github blog查看 在 ES6 中增加了對類對象的相關定義和操作(比如 class 和 extends ),這就使得我們在多個不同類之間共享或者擴展一些方法或者行為的時候,變得并...
閱讀 1026·2021-11-23 09:51
閱讀 2344·2021-10-08 10:22
閱讀 2544·2021-09-29 09:35
閱讀 855·2021-09-22 15:20
閱讀 2859·2019-08-30 15:53
閱讀 2413·2019-08-30 13:55
閱讀 1097·2019-08-29 17:27
閱讀 2870·2019-08-29 17:26