• 类的装饰器


    一、与函数的装饰器一样,类也可以被装饰

    def deco(func):
        print('=============>')
        return func
    
    @deco    #test = deco(test)
    def test():
        print('test函数')
    
    test()
    

    在装饰器给类设置属性

    def deco(obj):
        print('=============>')
        obj.x = 1
        obj.y = 2
        obj.z = 3
        return obj
    
    @deco    #test = deco(test)
    def test():
        print('test函数')
    
    print(test.__dict__)
    

      

    上述代码在装饰器函数中把属性写死了,如果不同的类需要设置不同的属性呢

    def deco(**kwargs):
        def wrapper(obj):
            for key,val in kwargs.items():
                setattr(obj,key,val)
            return obj
        return wrapper
    
    @deco(x = 1,y = 2, z = 3)  #1.deco(x= 1,y= 2,z=3) --->wrapper 2.Foo = wrapper(Foo)
    class Foo:
        pass
    
    print(Foo.__dict__)
    
    @deco(name= 'jinling')
    class Bar:
        pass
    print(Bar.name)
    print(Bar.__dict__)
    

    与前面描述符应用结合,类的装饰器的应用

    class Typed:
        def __init__(self,key,excp_typed):
            self.key = key
            self.excp_typed = excp_typed
        def __get__(self, instance, owner):
            print('正在执行get方法')
            return instance.__dict__[self.key]
        def __set__(self, instance, value):
            print('正在执行set方法')
            if not isinstance(value,self.excp_typed):
                raise TypeError("你传入的参数类型不是",self.excp_typed)
            instance.__dict__[self.key] = value
        def __delete__(self, instance):
            print("正在执行delete方法")
            instance.__dict__.pop(self.key)
    
    def deco(**kwargs):   #kwargs = {'name';str,'age':int}
        def wrapper(obj):  #obj = People
            for key, val in kwargs.items():  #(('name',str),('age',int))
                print("=====>")
                setattr(obj, key,Typed(key,val))  #People.name = Type('name',str)
    
            return obj
        return wrapper
    @deco(name = str, age = int)   #@wrapper ==>People = wrapper(People)
    class People:
        def __init__(self,name,age,salary):
            self.name = name
            self.age = age
            self.salary = salary
    
    p1 = People('jinling',19,13000)
    print(p1.__dict__)
    

      

      

     

    一个奋斗中的产品小白
  • 相关阅读:
    sql-定义变量
    sql-逻辑循环while if
    iOS生命周期
    iOS系统架构
    SVN记住密码
    视图在控制权限的作用
    20140524数据库课笔记
    char和varchar区别
    多表查找
    create table约束
  • 原文地址:https://www.cnblogs.com/dabai123/p/11666055.html
Copyright © 2020-2023  润新知