成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python之屬性描述符

alin / 2925人閱讀

摘要:作為一個小白,每天都在不斷地看東西,學(xué)知識,今天給大家介紹一個好東西屬性描述符什么是屬性描述符呢其實在一個類中實現(xiàn)中任意一個魔法函數(shù)就是一個屬性描述符。接下來我們定義一個屬性描述符當(dāng)我們用類或者實例來調(diào)用該屬性時,會返回函數(shù)的結(jié)果。

作為一個小白,每天都在不斷地看東西,學(xué)知識,今天給大家介紹一個好東西——屬性描述符
什么是屬性描述符呢?
其實在一個類中實現(xiàn)set__、__get__、__delete中任意一個魔法函數(shù)就是一個屬性描述符。
接下來我們定義一個屬性描述符:

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)我們用類或者實例來調(diào)用該屬性時,會返回__get__函數(shù)的結(jié)果。
__set__:當(dāng)我們用實例來設(shè)置屬性值時,Python會調(diào)用該函數(shù)。對類沒有限制作用。
__delete__:當(dāng)我們用實例試圖刪除該屬性時,Python會調(diào)用該函數(shù)。對類沒有限制作用。
到底這個東西怎么用呢?接下來為大家修改上面的代碼

class IntegerField:
    def __get__(self, instance, owner):
        return self.value
        
    def __set__(self, instance, value):
        if not isinstance(value,numbers.Integral):
            raise ValueError("請輸入一個整數(shù)")
        self.value=value
        
    def __delete__(self, instance):
        pass


class User:
    high=IntegerField()
    
#驗證代碼
if __name__ == "__main__":
    user=User()
    user.high="175"    #報錯,ValueError:請輸入一個整數(shù)
    User.high=175    #正確執(zhí)行,不報錯

這樣我們就能夠運(yùn)用屬性描述符來給屬性附上一定的邏輯了。
其實在屬性描述符下還分為
1、數(shù)據(jù)描述符:實現(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"    #這樣賦值時可以的,并且可以放入__dict__中
    print(user.high)    #會報錯,因為在調(diào)用__get__方法時并沒有value屬性

2、非數(shù)據(jù):實現(xiàn)__get__不實現(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"    #會放入user.__dict__中
    print(user.__dict__)    

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42777.html

相關(guān)文章

  • Python中的屬性描述

    摘要:下面我們用描述符來實現(xiàn)中的動態(tài)屬性和特性中提及的訂單結(jié)算代碼第四版使用描述符實現(xiàn)訂單結(jié)算功能描述符基于協(xié)議實現(xiàn),無需創(chuàng)建子類。特性是覆蓋型描述符。非覆蓋型描述符沒有實現(xiàn)方法的描述符屬于非覆蓋型描述符。類中定義的方法是非覆蓋型描述符。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之元編程篇的重點(diǎn)知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、了解描述符...

    geekzhou 評論0 收藏0
  • [譯] 屬性訪問、特性和描述 2

    摘要:不像其他屬性,描述符在類級別上創(chuàng)建。當(dāng)所有者類被定義時,每個描述符對象都是被綁定到一個不同的類級別屬性的描述符類實例。這必須返回描述符的值。此外,描述符對有一個方便的響應(yīng)和請求格式。 注:原書作者 Steven F. Lott,原書名為 Mastering Object-oriented Python __getattribute__()方法 __getattribute__()方法是...

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

    摘要:更多描述可見文檔這種惰性求值的方法在很多模塊中都會使用,比如中的使用上與例子一致,如表單中的討論在大部分情況下,讓屬性具有惰性求值能力的全部意義就在于提升程序性能。當(dāng)不需要這個屬性時就能避免進(jìn)行無意義的計算,同時又能阻止該屬性重復(fù)進(jìn)行計算。 起步 我們希望將一個只讀的屬性定義為 property 屬性方法,只有在訪問它時才進(jìn)行計算,但是,又希望把計算出的值緩存起來,不要每次訪問它時都重...

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

    摘要:最近在閱讀微型框架的源碼,發(fā)現(xiàn)了中有一個既是裝飾器類又是描述符的有趣實現(xiàn)。所以第三版的代碼可以這樣寫第三版的代碼沒有使用裝飾器,而是使用了描述符這個技巧。更大的問題來自如何將描述符與裝飾器結(jié)合起來,因為是一個類而不是方法。 最近在閱讀Python微型Web框架Bottle的源碼,發(fā)現(xiàn)了Bottle中有一個既是裝飾器類又是描述符的有趣實現(xiàn)。剛好這兩個點(diǎn)是Python比較的難理解,又混合在...

    Panda 評論0 收藏0
  • python模塊subprocess類與常量

    摘要:限于,可選的文件描述符序列,用于在父子進(jìn)程間保持開放。如果設(shè)置了,表示派生的進(jìn)程號子進(jìn)程返回碼,表示進(jìn)程未終止。如果未捕獲標(biāo)準(zhǔn)錯誤返回方法如果非,拋出異常異常模塊的異?;愖舆M(jìn)程執(zhí)行超時。 常量 subprocess.DEVNULL:可傳遞給stdin, stdout, stderr參數(shù)的特殊值,意味著將使用特殊文件os.devnull重定向輸入輸出 subprocess.PIPE:可...

    Alan 評論0 收藏0

發(fā)表評論

0條評論

alin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<