Python中利用描述符以及装饰器实现数据类型校验

 

Python和js相似是弱类型语言,对变量赋值没有没有严格意义限制;

以下通过描述符以及装饰器来实现对用户数据进行类型校验;

装饰器定义好类的属性类型,实例化时会在装饰器中校验People的name类型以及age类型

 

 1 """
 2     描述符:实现 __get__() __set()__ 任意两个函数
 3 """
 4 
 5 
 6 class Typed:
 7     def __init__(self, key, valid_type):
 8         self.key = key
 9         self.valid_type = valid_type
10 
11     def __get__(self, instance, owner):
12         return instance.__dict__[self.key]
13 
14     def __set__(self, instance, value):
15         if not isinstance(value, self.valid_type):
16             raise TypeError('Invalid data type, pls check')
17         instance.__dict__[self.key] = value
18 
19 
20 def deco(**kwargs):
21     def wrapper(obj):
22         for key, val in kwargs.items():
23             setattr(obj, key, Typed(key, val))
24         return obj
25     return wrapper
26 
27 
28 @deco(name=str, age=int)
29 class People:
30     # name = Typed('name', str)
31     def __init__(self, name, age):
32         self.name = name
33         self.age = age
34 
35 
36 p1 = People('louis', 18)
37 print(p1.__dict__)  # {'name': 'louis', 'age': 18}
38 p2 = People('scar', '24')  # TypeError: Invalid data type, pls check

 

posted @ 2020-02-26 15:55  待我身高一米八  阅读(461)  评论(0)    收藏  举报