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