首頁  >  文章  >  後端開發  >  python中屬性描述符的詳細介紹(程式碼範例)

python中屬性描述符的詳細介紹(程式碼範例)

不言
不言轉載
2018-12-12 10:37:112784瀏覽

本篇文章帶給大家的內容是關於python中屬性描述符的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

作為一個小白,每天都在不斷地看東西,學知識,今天給大家介紹一個好東西-屬性描述子

什麼是屬性描述符呢?

其實在一個類別中實作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__)

以上是python中屬性描述符的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除