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

資訊專欄INFORMATION COLUMN

python之屬性描述符

alin / 2991人閱讀

摘要:作為一個(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

相關(guān)文章

  • Python中的屬性描述

    摘要:下面我們用描述符來(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、了解描述符...

    geekzhou 評(píng)論0 收藏0
  • [譯] 屬性訪問(wèn)、特性和描述 2

    摘要:不像其他屬性,描述符在類級(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__()方法是...

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

    摘要:更多描述可見(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í)都重...

    NervosNetwork 評(píng)論0 收藏0
  • Bottle框架中的裝飾器類和描述應(yīng)用

    摘要:最近在閱讀微型框架的源碼,發(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比較的難理解,又混合在...

    Panda 評(píng)論0 收藏0
  • python模塊subprocess類與常量

    摘要:限于,可選的文件描述符序列,用于在父子進(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:可...

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

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

0條評(píng)論

alin

|高級(jí)講師

TA的文章

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