91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python怎么使用描述符實現屬性類型檢查

發布時間:2022-05-13 13:40:25 來源:億速云 閱讀:133 作者:iii 欄目:開發技術

這篇“Python怎么使用描述符實現屬性類型檢查”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python怎么使用描述符實現屬性類型檢查”文章吧。

    1、如何使用描述符對實例屬性做類型檢查?

    實際案例:

    在某項目中,我們實現了一些類,并希望能像靜態類型語言那樣(C,C++,Java)對它們的實例屬性做類型檢查。

    p = Person()
        p.name = 'Bob'	# 名字屬性必須是str
        p.age = 18	        # 年齡必須是int
        p.height = 1.83	# 身高必須是float

    要求:(1)可以對實例變量名指定類型

    (2)賦予不正確類型時拋出異常

    解決方案:

    使用描述符來實現需要類型檢查的屬性:分別實現__get__, __set__,__delete__方法,在__set__內使用isinstance函數做類型檢查。

    拓展:靜態類型語言變量只能引用一種確定類型的對象并且不能改變。類型檢查是由編譯器在編譯階段完成的,對于Python動態類型語言來講一個變量可以引用任意類型的對象并且可以實時發生改變,也就是解釋器不能完成類型檢查,只能自己去實現。

    什么是描述符?描述符就是包含__get__, __set__,__delete__這樣方法的類,這三個方法只要包含其中一個那它就是描述符。

    實例屬性就是在一個類中將另一個類的實例作為該類的一個數屬性。

    2、代碼演示

    (1)描述符定義和訪問流程介紹

    class Descriptor(object):
        def __get__(self, instance, cls):
            # instance用于區分使用類訪問x,還是使用實例訪問x
            print('in __get__', instance, cls)
            return instance.__dict__['x']
        def __set__(self, instance, value):
            # 在set中對于類型進行檢查
            print('in __set__')
            instance.__dict__['x'] = value
        def __delete__(self, instance):
            print('in __del__')
    class A(object):
        # 在類中定義一個類屬性x
        x = Descriptor()
    a = A()
    # 會被Descriptor的__get__方法所截獲
    print(a.x)
    # 直接使用類A訪問類屬性,instance會被傳入None
    print(A.x)
    # 會被Descriptor的__set__方法所截獲
    a.x = 5
    # 會被Descriptor的__del__方法所截獲
    del a.x
    '''
    通常來說在描述符這些方法當中訪問的是instance.__dict__這個字典,
    也就是對于它的真正屬性進行操作。
    '''
    a = A()
    a.x = 5
    print(a.__dict__)

    (2)實現使用描述符檢查實例屬性類型

    class Attr(object):
        def __init__(self, name, type_):
            self.name = name
            self.type_ = type_
        def __get__(self, instance, cls):
            return instance.__dict__[self.name]
        def __set__(self, instance, value):
            # 對字段類型做檢測
            if not isinstance(value, self.type_):
                raise TypeError('expected an %s' % self.type_)
            instance.__dict__[self.name] = value
        def __delete__(self, instance):
            del instance.__dict__[self.name]
    class Person(object):
        # 定義一個name字段,申請描述符實例
        name = Attr('name', str)
        age = Attr('age', int)
        height = Attr('height', float)
    p = Person()
    p.name = 'Bob'
    print(p.name)
    # age賦值字符串類型拋出異常錯誤
    # p.age = '17'

    以上就是關于“Python怎么使用描述符實現屬性類型檢查”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    革吉县| 康定县| 拜泉县| 武夷山市| 福建省| 兴义市| 河曲县| 赣州市| 房产| 买车| 称多县| 南华县| 高台县| 平果县| 高淳县| 西乡县| 称多县| 阳城县| 鹿泉市| 梅州市| 邹城市| 进贤县| 陆河县| 绥江县| 错那县| 吴忠市| 黄平县| 罗定市| 汝州市| 河间市| 白水县| 新泰市| 和林格尔县| 万山特区| 东兰县| 南京市| 赤峰市| 荣昌县| 绍兴市| 新宁县| 山西省|