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

------------恢复内容开始------------

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

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

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

 1 """
 2     修饰符:实现 __get__() __set()__ __delete()__任意一个函数
 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

------------恢复内容开始------------

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

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

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

 1 """
 2     修饰符:实现 __get__() __set()__ __delete()__任意一个函数
 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

------------恢复内容结束------------

------------恢复内容结束------------

猜你喜欢

转载自www.cnblogs.com/louiszh/p/12367422.html