• python装饰器详解


    本文链接:https://www.cnblogs.com/tujia/p/13144814.html

    一句话说明:print( get_something(params) ) 实例上调用的是 print( auth(get_something)(params) )

    解释:

    1)装饰器本身也是一个函数,并且它的返回值也必须是一个函数;

    2)处理过程是把原函数当作参数传入装饰器函数,然后向返回的函数传入原函数的参数并执行,最后得到执行结果

    Demo1 装饰器啥也不做,直接返回函数本身:

    def auth(func):
        return func
    
    
    @auth
    def get_something():
        return '大宝贝'
    
    
    print(get_something())

    # 大宝贝

    注:装饰器返回的函数会被自动执行。

    Demo2 装饰器返回了函数,但没处理原函数:

    def auth(func):
        def anonymity():
            return '无关的东东'
        return anonymity
    
    
    @auth
    def get_something():
        return '大宝贝'
    
    
    print(get_something())

    # 无关的东东

    注:返回anonymity函数会自动执行了,返回 "无关的东东";但 func(即 get_something)没有被处理到。

    Demo3 装饰器内部函数返回被装饰函数:

    def auth(func):
        def anonymity():
            return func
        return anonymity
    
    
    @auth
    def get_something():
        return '大宝贝'
    
    
    print(get_something())
    
    # <function get_something at 0x057DB468>

    注:这个demo乍看和Demo1是一样的,但其实是不一样的。auth装饰器返回的是 anonymity 函数会自动被执行,但返回的是 func 函数对象,func并没有被执行 。

    Demo4 在auth装饰器里的anonmity函数里直接执行 get_something 但没返回结果:

    def auth(func):
        def anonymity():
            func()
            return None
        return anonymity
    
    
    @auth
    def get_something():
        print('你调用了 get_something 函数')
        return '大宝贝'
    
    
    print(get_something())
    
    # 你调用了 get_something 函数
    # None

    注:auth返回anonmity并被自动执行的时候,会调用func函数(也就是get_something函数)输出 ”你调用了 get_something 函数“,但没有接收和处理到 func() 的返回值,所以不会输出“大宝贝”。

    Demo5 同上,但返回的不是None,是返回 func 的函数结果:

    def auth(func):
        def anonymity():
            return func()
        return anonymity
    
    
    @auth
    def get_something():
        print('你调用了 get_something 函数')
        return '大宝贝'
    
    
    print(get_something())
    
    # 你调用了 get_something 函数
    # 大宝贝

    注: anonymity被执行的时候,执行了 func(),并返回了 func() 的返回值。

    Demo6 接收被装饰函数的参数:

    def auth(func):
        def anonymity(token):
            if token == '123456':
                return func(token)
            else:
                return None
        return anonymity
    
    
    @auth
    def get_something(token):
        return '大宝贝'
    
    
    print(get_something('123456'))
    print(get_something('456789'))
    
    # 大宝贝
    # None

    注:anonymity接收了token参数但做了判断,判断是否执行 func 函数(原get_something函数)

    Demo 7 接收原函数所有参数:

    def auth(func):
        def anonymity(*args, **kwargs):
            if 'token' in kwargs:
                token = kwargs['token']
            else:
                token = args[0]
    
            if token == '123456':
                return func(*args, **kwargs)
            else:
                return None
        return anonymity
    
    
    @auth
    def get_something(token):
        return '大宝贝'
    
    
    print(get_something('123456'))
    print(get_something(token='456789'))
    
    # 大宝贝
    # None

    注:关键是 *args 和 **kwargs

    Demo8 带参数的装饰器:

    def auth(source=''):
        def wrap(func):
            def anonymity(*args, **kwargs):
                token = kwargs['token'] if 'token' in kwargs else args[0]
    
                if source == 'app' and token == '123456':
                    return func(*args, **kwargs)
                elif source == 'm' and token == '456789':
                    return func(*args, **kwargs)
                else:
                    return None
            return anonymity
        return wrap
    
    
    @auth(source='app')
    def app_get_something(token):
        return '大宝贝'
    
    
    @auth(source='m')
    def m_get_something(token):
        return '大宝贝'
    
    
    print(app_get_something(token='123456'))
    print(m_get_something(token='456789'))
    
    # 大宝贝
    # 大宝贝

    注:当装饰器增加传入参数时,装饰器要多嵌套一层函数,原函数被当作参数传给装饰器的返回函数,原函数的参数被传入装饰器的返回函数的返回函数

    即:auth(source='app')(app_get_something)(token='123456') 、auth(source='m')(m_get_something)(token='456789')


    完。

    本文链接:https://www.cnblogs.com/tujia/p/13144814.html

  • 相关阅读:
    [Inno Setup] 待读
    How do you close then restart explorer.exe in Inno Setup uninstall using the Restart Manager?
    [Inno Setup] 安装与卸载 Shell Extension DLL
    用Linux 搭建 PXE 网络引导环境
    优化Docker 镜像小技巧 转载:https://mp.weixin.qq.com/s/sSgXYbF5anubvVYQfVGQ3g
    升级centos内核,转载:http://www.mydlq.club/article/79/
    故障排查:Kubernetes 中 Pod 无法正常解析域名 转载:http://www.mydlq.club/article/78/
    VirtualBox虚拟机全屏显示
    temp
    Kubernetes Deployment故障排除图解指南 转载
  • 原文地址:https://www.cnblogs.com/tujia/p/13144814.html
Copyright © 2020-2023  润新知