2019年9月22日 类的装饰器

装饰器本身就是函数 

回顾:

复制代码
def deco(func):
    print('>>deco>>')
    return func

@deco # 做了 这么一件事情:test=deco(test)
def test():
    print('testing')

test()
复制代码

》》》》》》

>>deco>>
testing

复制代码
def deco(obj):
    print('>>deco>>',obj)
    obj.x=1
    obj.y=2
    obj.z=3
    return obj

@deco #Foo=deco(Foo)
class Foo:
    pass

f1=Foo()
print(Foo.__dict__)
复制代码

>>>>>>

>>deco>> <class '__main__.Foo'>
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None, 'x': 1, 'y': 2, 'z': 3}

 

复制代码
def deco(obj):
    print('>>deco>>',obj)
    obj.x=1
    obj.y=2
    obj.z=3
    return obj


@deco
def test():#验证一切皆对象
    print('testing')
print(test.__dict__)
复制代码

》》》》

>>deco>> <function test at 0x10203d048>
{'x': 1, 'y': 2, 'z': 3}

 

复制代码
def Typed(**kwargs):#通过函数的嵌套,达到加参数的目的
    def deco(obj):
        print('>>deco>>',obj)
        print('deco',kwargs)
        for key,val in kwargs.items():
            # obj.__dict__[key]=val#这个方法不知道为啥不行
            setattr(obj,key,val)
        return obj
    print('>>>',kwargs)#先执行这一步
    return deco#再执行这一步


@Typed(x=1,y=2,z=3)#先运行Typed函数
class Foo:
    pass

print(Foo.__dict__)
复制代码

>>>>>

>>> {'x': 1, 'y': 2, 'z': 3}
>>deco>> <class '__main__.Foo'>
deco {'x': 1, 'y': 2, 'z': 3}
{'__module__': '__main__', '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None, 'x': 1, 'y': 2, 'z': 3}

 

 

`

posted @   小圣庄  阅读(118)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· 2025成都.NET开发者Connect圆满结束
· Ollama本地部署大模型总结
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 在 VS Code 中,一键安装 MCP Server!
· 用一种新的分类方法梳理设计模式的脉络
点击右上角即可分享
微信分享提示