您好,登錄后才能下訂單哦!
這篇“Python怎么使用描述符實現屬性類型檢查”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python怎么使用描述符實現屬性類型檢查”文章吧。
在某項目中,我們實現了一些類,并希望能像靜態類型語言那樣(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__這樣方法的類,這三個方法只要包含其中一個那它就是描述符。
實例屬性就是在一個類中將另一個類的實例作為該類的一個數屬性。
(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怎么使用描述符實現屬性類型檢查”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。