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}

 

posted @ 2019-09-26 15:32  Mr-谢  阅读(1082)  评论(0编辑  收藏  举报