python類與對象-如何使用描述符對實例屬性做類型檢查
阿新 • • 發佈:2019-05-06
sin del pass 類型檢查 使用 問題 typeerror tom 添加
如何使用描述符對實例屬性做類型檢查
問題舉例
在某些項目中,我們實現一些類,並希望能像靜態類型語言那樣對它們的
實例屬性做類型檢查:
p = Persosn()
p.name = ‘tom‘ #必須是str
p.age = 18 #必須是int
要求:
(1)可對實例屬性指定類型
(2)賦予不正確類型時拋出異常
分析
class A(): pass a = A() #a.x = ‘hello‘ #a.__dict__[‘x‘] = ‘hello‘
a.x = ‘hello‘等價於a.__dict__[‘x‘] = ‘hello‘, 需要類提供一個接口對屬性所賦的值做類型檢查,手動添加屬性的值
解決思路
使用描述符來實現需要類型檢查的屬性:分別實現__get__, __set__, __delete__方法,在__set__中使用isinstance函數做類型檢查
代碼
class Attr: def __init__(self, key, type_): self.key = key self.type_ = type_ def __set__(self, instance, value): print(‘in __set__‘) if not isinstance(value, self.type_):raise TypeError(‘must be %s‘ % self.type_) instance.__dict__[self.key] = value def __get__(self, instance, cls): print(‘in __get__‘, instance, cls) return instance.__dict__[self.key] def __delete__(self, instance): print(‘in __del__‘, instance)del instance.__dict__[self.key] class Person: name = Attr(‘name‘, str) age = Attr(‘age‘, int) p = Person() p.name = ‘tom‘ #p.age = 20 p.age = ‘20‘
參考資料:python3實用編程技巧進階
python類與對象-如何使用描述符對實例屬性做類型檢查