• Python学习第十九课——类的装饰器


    类的装饰器

    # def deco(func):
    #     print('==========')
    #     return func
    #
    # # @deco       #test=deco(test)
    # # def test():
    # #     print('test函数运行')
    # # test()
    #
    # @deco #Foo=deco(Foo)
    # class Foo:
    #     pass
    
    
    
    
    def deco(obj):
        print('==========',obj)
        obj.x=1
        obj.y=2
        obj.z=3
        return obj
    # @deco #Foo=deco(Foo)
    # class Foo:
    #     pass
    #
    # print(Foo.__dict__)
    
    #一切皆对象
    # # @deco #test=deco(test)
    # def test():
    #     print('test函数')
    # test.x=1
    # test.y=1
    # print(test.__dict__)

    类的装饰器加强版

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

    类的装饰器的应用

    class Typed:
        def __init__(self,key,expected_type):
            self.key=key
            self.expected_type=expected_type
        def __get__(self, instance, owner):
            print('get方法')
            # print('instance参数【%s】' %instance)
            # print('owner参数【%s】' %owner)
            return instance.__dict__[self.key]
        def __set__(self, instance, value):
            print('set方法')
            # print('instance参数【%s】' % instance)
            # print('value参数【%s】' % value)
            # print('====>',self)
            if not isinstance(value,self.expected_type):
                # print('你传入的类型不是字符串,错误')
                # return
                raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type))
            instance.__dict__[self.key]=value
        def __delete__(self, instance):
            print('delete方法')
            # print('instance参数【%s】' % instance)
            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))
                setattr(obj,key,Typed(key,val))
                # setattr(People,'name',Typed('name',str)) #People.name=Typed('name',str)
            return obj
        return wrapper
    @deco(name=str,age=int)  #@wrapper ===>People=wrapper(People)
    class People:
        name='alex'
        # name=Typed('name',str)
        # age=Typed('age',int)
        def __init__(self,name,age,salary,gender,heigth):
            self.name=name
            self.age=age
            self.salary=salary
    # p1=People('213',13.3,13.3,'x','y')
    print(People.__dict__)
  • 相关阅读:
    MuJS官网示例讲解
    Windows下用Bochs编译运行Linux-0.11(转)
    mysql数据库设置远程连接权限
    Courses in Computer Science and Engineering
    docker-ce 安装和卸载
    实现自定义docker 镜像共享
    cmakelists.txt中配置openg环境出现: undefined reference to symbol 'glLightfv'
    ubuntu16.04如何查看内存和CPU的使用情况
    ROS
    QT_OPENGL-------- 5.model
  • 原文地址:https://www.cnblogs.com/pyhan/p/12326273.html
Copyright © 2020-2023  润新知