类的装饰器

#类的装饰器
def deco(**kwargs):
    def war(obj):
        for key,val in kwargs.items():
            setattr(obj,key,val)       #将传的参数添加到类属性字典中
        return obj
    return war

@deco(x=1,y=2)         #运行war,并传参数-->Foo = war(Foo)
class Foo:
    pass

print(Foo.__dict__)
#例题
class Typed:
    def __init__(self,key,expected_type):
        self.key = key
        self.expected_type = expected_type
    def __get__(self, instance, owner):
        print("执行get")
    def __set__(self, instance, value):
        print("执行set")
        # print(value)
        if not isinstance(value,self.expected_type):
            raise TypeError("请输入 %s 类型" %self.expected_type)
        instance.__dict__[self.key] = value
    def __delete__(self, instance):
        print("执行delete")

def deco(**kwargs):
    def war(obj):
        for key,val in kwargs.items():
            setattr(obj,key,Typed(key,val))    #实现name = Type(”name“,str)
        return obj
    return war

@deco(name=str)
class People:
    # name = Typed("name",str)
    def __init__(self,name,age,salary):
        self.name = name
        self.age = age
        self.salary = salary

p1 = People("ss",22,23.4)
print(p1.__dict__)

 

posted @ 2019-05-17 00:29  saber゛  Views(167)  Comments(0Edit  收藏  举报