Python使用描述符實(shí)現(xiàn)屬性類型檢查的案例解析
1、如何使用描述符對(duì)實(shí)例屬性做類型檢查?
實(shí)際案例:
在某項(xiàng)目中,我們實(shí)現(xiàn)了一些類,并希望能像靜態(tài)類型語(yǔ)言那樣(C,C++,Java)對(duì)它們的實(shí)例屬性做類型檢查。
p = Person()
p.name = 'Bob' # 名字屬性必須是str
p.age = 18 # 年齡必須是int
p.height = 1.83 # 身高必須是float要求:(1)可以對(duì)實(shí)例變量名指定類型
(2)賦予不正確類型時(shí)拋出異常
解決方案:
使用描述符來(lái)實(shí)現(xiàn)需要類型檢查的屬性:分別實(shí)現(xiàn)__get__, __set__,__delete__方法,在__set__內(nèi)使用isinstance函數(shù)做類型檢查。
拓展:靜態(tài)類型語(yǔ)言變量只能引用一種確定類型的對(duì)象并且不能改變。類型檢查是由編譯器在編譯階段完成的,對(duì)于Python動(dòng)態(tài)類型語(yǔ)言來(lái)講一個(gè)變量可以引用任意類型的對(duì)象并且可以實(shí)時(shí)發(fā)生改變,也就是解釋器不能完成類型檢查,只能自己去實(shí)現(xiàn)。
什么是描述符?描述符就是包含__get__, __set__,__delete__這樣方法的類,這三個(gè)方法只要包含其中一個(gè)那它就是描述符。
實(shí)例屬性就是在一個(gè)類中將另一個(gè)類的實(shí)例作為該類的一個(gè)數(shù)屬性。
2、代碼演示
(1)描述符定義和訪問(wèn)流程介紹
class Descriptor(object):
def __get__(self, instance, cls):
# instance用于區(qū)分使用類訪問(wèn)x,還是使用實(shí)例訪問(wèn)x
print('in __get__', instance, cls)
return instance.__dict__['x']
def __set__(self, instance, value):
# 在set中對(duì)于類型進(jìn)行檢查
print('in __set__')
instance.__dict__['x'] = value
def __delete__(self, instance):
print('in __del__')
class A(object):
# 在類中定義一個(gè)類屬性x
x = Descriptor()
a = A()
# 會(huì)被Descriptor的__get__方法所截獲
print(a.x)
# 直接使用類A訪問(wèn)類屬性,instance會(huì)被傳入None
print(A.x)
# 會(huì)被Descriptor的__set__方法所截獲
a.x = 5
# 會(huì)被Descriptor的__del__方法所截獲
del a.x
'''
通常來(lái)說(shuō)在描述符這些方法當(dāng)中訪問(wèn)的是instance.__dict__這個(gè)字典,
也就是對(duì)于它的真正屬性進(jìn)行操作。
'''
a = A()
a.x = 5
print(a.__dict__)(2)實(shí)現(xiàn)使用描述符檢查實(shí)例屬性類型
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):
# 對(duì)字段類型做檢測(cè)
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):
# 定義一個(gè)name字段,申請(qǐng)描述符實(shí)例
name = Attr('name', str)
age = Attr('age', int)
height = Attr('height', float)
p = Person()
p.name = 'Bob'
print(p.name)
# age賦值字符串類型拋出異常錯(cuò)誤
# p.age = '17'到此這篇關(guān)于Python使用描述符實(shí)現(xiàn)屬性類型檢查的文章就介紹到這了,更多相關(guān)python屬性類型檢查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Python實(shí)現(xiàn)Apriori算法介紹
這篇文章主要介紹了淺談Python實(shí)現(xiàn)Apriori算法介紹,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Python實(shí)現(xiàn)歷史記錄功能(實(shí)際案例)
很多應(yīng)用程序都有瀏覽用戶的歷史記錄的功能,瀏覽器可以查看最近訪問(wèn)過(guò)的網(wǎng)頁(yè),現(xiàn)在我們制作了一個(gè)簡(jiǎn)單的猜數(shù)字的小游戲,添加歷史記錄功能,顯示用戶最近猜過(guò)的數(shù)字,如何實(shí)現(xiàn)呢?跟隨小編一起看看吧2022-04-04
Python中分?jǐn)?shù)的相關(guān)使用教程
這篇文章主要介紹了Python中分?jǐn)?shù)的相關(guān)使用教程,主要涉及分?jǐn)?shù)的計(jì)算、約分等簡(jiǎn)單操作,是Python學(xué)習(xí)過(guò)程當(dāng)中的基礎(chǔ),需要的朋友可以參考下2015-03-03
Python命令行定時(shí)任務(wù)自動(dòng)化工作流程
本文介紹如何使用Python編寫定時(shí)任務(wù),以自動(dòng)執(zhí)行命令行任務(wù)。您將學(xué)習(xí)如何安排定期的任務(wù),處理任務(wù)結(jié)果,以及如何使用Python自動(dòng)化工作流程,從而提高工作效率。無(wú)需手動(dòng)執(zhí)行重復(fù)任務(wù),Python幫您搞定2023-04-04
python index() 與 rindex() 方法的使用示例詳解
這篇文章主要介紹了python index() 與 rindex() 方法的使用,需要的朋友可以參考下2022-12-12
python銀行卡號(hào)碼校驗(yàn)Luhn模10算法
這篇文章主要為大家介紹了python銀行卡號(hào)碼校驗(yàn)Luhn模10算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
在PyCharm的 Terminal(終端)切換Python版本的方法
這篇文章主要介紹了在PyCharm的 Terminal(終端)切換Python版本的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

