python使用描述符给属性做强类型(强制str类型/int类型)
#使用描述符的方法
class Types: def __init__(self,type,key): self.type = type self.key = key def __get__(self, instance, owner): return instance.__dict__[self.key] def __set__(self, instance, value): if not isinstance(value,self.type): mess = "%s的值为%s类型" % (self.key,self.type) raise TypeError(mess) else: instance.__dict__[self.key] = value def __delete__(self, instance): instance.__dict__.pop(self.key) class People: name = Types(str,'name') age = Types(int,'age') def __init__(self,name,age): self.name = name self.age = age
p1 = People('asd',12) print(p1.name) print(p1.__dict__) p1.name = 'alex' print(p1.name) print(p1.__dict__) p1.age = 22 print(p1.age) print(p1.__dict__)
#使用类的装饰器结合描述符 def deco(**kwargs): def wrapper(obj): for key,val in kwargs.items(): setattr(obj,key,Types(val,key)) return obj return wrapper class Types: def __init__(self,type,key): self.type = type self.key = key def __get__(self, instance, owner): return instance.__dict__[self.key] def __set__(self, instance, value): if not isinstance(value,self.type): mess = "%s的值为%s类型" % (self.key,self.type) raise TypeError(mess) else: instance.__dict__[self.key] = value def __delete__(self, instance): instance.__dict__.pop(self.key) @deco(name=str,age=int) class People: # name = Types(str,'name') # age = Types(int,'age') def __init__(self,name,age): self.name = name self.age = age
print(People.__dict__) p1 = People('asd',12) print(p1.name) print(p1.__dict__) p1.name = 'alex' print(p1.name) print(p1.__dict__) p1.age = 22 print(p1.age) print(p1.__dict__)
结果:
{'__module__': '__main__', '__init__': <function People.__init__ at 0x000000000291D1E0>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None, 'name': <__main__.Types object at 0x0000000002909860>, 'age': <__main__.Types object at 0x0000000002909898>}
asd
{'name': 'asd', 'age': 12}
alex
{'name': 'alex', 'age': 12}
22
{'name': 'alex', 'age': 22}