1. 程式人生 > >python類與對象-如何使用描述符對實例屬性做類型檢查

python類與對象-如何使用描述符對實例屬性做類型檢查

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類與對象-如何使用描述符對實例屬性做類型檢查