首页 > 编程语言 > 详细

python使用描述符给属性做强类型(强制str类型/int类型)

时间:2019-09-26 17:29:55      阅读:110      评论:0      收藏:0      [点我收藏+]
#使用描述符的方法
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}

 

python使用描述符给属性做强类型(强制str类型/int类型)

原文:https://www.cnblogs.com/xieys-1993/p/11592124.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!