亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python使用描述符實現(xiàn)屬性類型檢查的案例解析

 更新時間:2022年05月13日 09:52:59   作者:AllardZhao  
這篇文章主要介紹了Python使用描述符實現(xiàn)屬性類型檢查,實例屬性就是在一個類中將另一個類的實例作為該類的一個數(shù)屬性,本文通過代碼演示給大家介紹的非常詳細,需要的朋友可以參考下

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

實際案例:

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

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

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

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

解決方案:

使用描述符來實現(xiàn)需要類型檢查的屬性:分別實現(xiàn)__get__, __set__,__delete__方法,在__set__內(nèi)使用isinstance函數(shù)做類型檢查。

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

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

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

2、代碼演示

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

class Descriptor(object):
    def __get__(self, instance, cls):
        # instance用于區(qū)分使用類訪問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)實現(xiàn)使用描述符檢查實例屬性類型

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使用描述符實現(xiàn)屬性類型檢查的文章就介紹到這了,更多相關python屬性類型檢查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談Python實現(xiàn)Apriori算法介紹

    淺談Python實現(xiàn)Apriori算法介紹

    這篇文章主要介紹了淺談Python實現(xiàn)Apriori算法介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 基于Python進行年齡和性別檢測

    基于Python進行年齡和性別檢測

    這篇文章主要介紹了通過Python 編程語言帶您完成使用機器學習進行年齡和性別檢測的任務。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2021-12-12
  • Python實現(xiàn)歷史記錄功能(實際案例)

    Python實現(xiàn)歷史記錄功能(實際案例)

    很多應用程序都有瀏覽用戶的歷史記錄的功能,瀏覽器可以查看最近訪問過的網(wǎng)頁,現(xiàn)在我們制作了一個簡單的猜數(shù)字的小游戲,添加歷史記錄功能,顯示用戶最近猜過的數(shù)字,如何實現(xiàn)呢?跟隨小編一起看看吧
    2022-04-04
  • Python中分數(shù)的相關使用教程

    Python中分數(shù)的相關使用教程

    這篇文章主要介紹了Python中分數(shù)的相關使用教程,主要涉及分數(shù)的計算、約分等簡單操作,是Python學習過程當中的基礎,需要的朋友可以參考下
    2015-03-03
  • Python線程池的實現(xiàn)淺析

    Python線程池的實現(xiàn)淺析

    當有多個?IO?密集型的任務要被處理時,我們自然而然會想到多線程。而線程池的實現(xiàn)也很簡單,因為?Python?提供了一個標準庫?concurrent.futures,已經(jīng)內(nèi)置了對線程池的支持。所以本篇文章,我們就來詳細介紹一下該模塊的用法
    2022-08-08
  • Python命令行定時任務自動化工作流程

    Python命令行定時任務自動化工作流程

    本文介紹如何使用Python編寫定時任務,以自動執(zhí)行命令行任務。您將學習如何安排定期的任務,處理任務結(jié)果,以及如何使用Python自動化工作流程,從而提高工作效率。無需手動執(zhí)行重復任務,Python幫您搞定
    2023-04-04
  • python index() 與 rindex() 方法的使用示例詳解

    python index() 與 rindex() 方法的使用示例詳解

    這篇文章主要介紹了python index() 與 rindex() 方法的使用,需要的朋友可以參考下
    2022-12-12
  • python銀行卡號碼校驗Luhn模10算法

    python銀行卡號碼校驗Luhn模10算法

    這篇文章主要為大家介紹了python銀行卡號碼校驗Luhn模10算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 在PyCharm的 Terminal(終端)切換Python版本的方法

    在PyCharm的 Terminal(終端)切換Python版本的方法

    這篇文章主要介紹了在PyCharm的 Terminal(終端)切換Python版本的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Python使用yaml模塊操作YAML文檔的方法

    Python使用yaml模塊操作YAML文檔的方法

    YAML是可讀性高,用來表達數(shù)據(jù)序列化格式的,專用于寫配置文件的語言,這篇文章主要介紹了Python使用yaml模塊操作YAML文檔,需要的朋友可以參考下
    2023-01-01

最新評論