摘要:作為一個小白,每天都在不斷地看東西,學知識,今天給大家介紹一個好東西屬性描述符什么是屬性描述符呢其實在一個類中實現中任意一個魔法函數就是一個屬性描述符。接下來我們定義一個屬性描述符當我們用類或者實例來調用該屬性時,會返回函數的結果。
作為一個小白,每天都在不斷地看東西,學知識,今天給大家介紹一個好東西——屬性描述符
什么是屬性描述符呢?
其實在一個類中實現set__、__get__、__delete中任意一個魔法函數就是一個屬性描述符。
接下來我們定義一個屬性描述符:
class IntegerField: def __get__(self, instance, owner): pass def __set__(self, instance, value): pass def __delete__(self, instance): pass class User: high= IntField()
__get__:當我們用類或者實例來調用該屬性時,會返回__get__函數的結果。
__set__:當我們用實例來設置屬性值時,Python會調用該函數。對類沒有限制作用。
__delete__:當我們用實例試圖刪除該屬性時,Python會調用該函數。對類沒有限制作用。
到底這個東西怎么用呢?接下來為大家修改上面的代碼
class IntegerField: def __get__(self, instance, owner): return self.value def __set__(self, instance, value): if not isinstance(value,numbers.Integral): raise ValueError("請輸入一個整數") self.value=value def __delete__(self, instance): pass class User: high=IntegerField() #驗證代碼 if __name__ == "__main__": user=User() user.high="175" #報錯,ValueError:請輸入一個整數 User.high=175 #正確執行,不報錯
這樣我們就能夠運用屬性描述符來給屬性附上一定的邏輯了。
其實在屬性描述符下還分為
1、數據描述符:實現了__set__、__get__
if __name__ == "__main__": user=User() user.high=175 print(user.__dict__) #high是不放入__dict__中的,優先查找數據描述符中的值 user.__dict__["high"]="abc" #這樣賦值時可以的,并且可以放入__dict__中 print(user.high) #會報錯,因為在調用__get__方法時并沒有value屬性
2、非數據:實現__get__不實現__set__
class NonField: def __init__(self, high=170): self.value = high def __get__(self, instance, owner): return self.value class User: high = NonField() if __name__ == "__main__": user = User() user.high = "175" #會放入user.__dict__中 print(user.__dict__)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42777.html
摘要:下面我們用描述符來實現中的動態屬性和特性中提及的訂單結算代碼第四版使用描述符實現訂單結算功能描述符基于協議實現,無需創建子類。特性是覆蓋型描述符。非覆蓋型描述符沒有實現方法的描述符屬于非覆蓋型描述符。類中定義的方法是非覆蓋型描述符。 導語:本文章記錄了本人在學習Python基礎之元編程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、了解描述符...
摘要:不像其他屬性,描述符在類級別上創建。當所有者類被定義時,每個描述符對象都是被綁定到一個不同的類級別屬性的描述符類實例。這必須返回描述符的值。此外,描述符對有一個方便的響應和請求格式。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __getattribute__()方法 __getattribute__()方法是...
摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當不需要這個屬性時就能避免進行無意義的計算,同時又能阻止該屬性重復進行計算。 起步 我們希望將一個只讀的屬性定義為 property 屬性方法,只有在訪問它時才進行計算,但是,又希望把計算出的值緩存起來,不要每次訪問它時都重...
摘要:最近在閱讀微型框架的源碼,發現了中有一個既是裝飾器類又是描述符的有趣實現。所以第三版的代碼可以這樣寫第三版的代碼沒有使用裝飾器,而是使用了描述符這個技巧。更大的問題來自如何將描述符與裝飾器結合起來,因為是一個類而不是方法。 最近在閱讀Python微型Web框架Bottle的源碼,發現了Bottle中有一個既是裝飾器類又是描述符的有趣實現。剛好這兩個點是Python比較的難理解,又混合在...
摘要:限于,可選的文件描述符序列,用于在父子進程間保持開放。如果設置了,表示派生的進程號子進程返回碼,表示進程未終止。如果未捕獲標準錯誤返回方法如果非,拋出異常異常模塊的異常基類子進程執行超時。 常量 subprocess.DEVNULL:可傳遞給stdin, stdout, stderr參數的特殊值,意味著將使用特殊文件os.devnull重定向輸入輸出 subprocess.PIPE:可...
閱讀 3573·2021-10-11 10:59
閱讀 1591·2021-09-29 09:35
閱讀 2259·2021-09-26 09:46
閱讀 3771·2021-09-10 10:50
閱讀 953·2019-08-29 12:17
閱讀 821·2019-08-26 13:40
閱讀 2433·2019-08-26 11:44
閱讀 2103·2019-08-26 11:22