《Django By Example》

Python - 学习理解带参数的装饰器

2020-02-13  本文已影响0人  思考的虫子

理解带参数的装饰器

参考文章 Python精进-装饰器与函数对象

加了装饰器这段代码从一个函数定义(不会执行任何东西,在内存单元中保存一段代码)变成了一条赋值语句(修改被装饰函数所在内存单元中的内容)exit

  1. 从运维角度看是装饰器补充了函数的功能, 从开发角度看是装饰器将函数作为参数
  2. 函数返回的函数无法被直接调用,除非将其返回值赋值个一个变量;列表就相当于这个函数,他的元素必须通过带参数执行这个函数获得。
  3. 该用函数还是装饰器,可以看是谁调用谁,从参数传递的方向也可以判断。

第一步: 定义装饰函数

def foo(a):
    def decorator(func):
        def wrap(*args):
            if not callable(a):
                print(a)
            return func(*args)
        return wrap
    if callable(a):
        return decorator(a)
    return decorator

# 装饰器带参数可以使得被装饰函数的改变有两种可能

第二步:使用装饰器装饰函数,调用新函数

第一种可能用法

@foo('hello')
def bar(c):
    print(c)
    return 0

装饰器的处理过程

装饰的作用是获得一个新函数

def bar(c):
    print(a)
    # 执行被装饰函数体
    print(c)
    # 将被装饰函数的返回值作为新函数的返回值,还是0
    return 0

调用被装饰后的函数显然应该为:

>>> bar('wold')
hello
world
0

第二种用法

@foo
def bar(c):
    print(c)
    return 0

装饰的作用是获得一个新函数

def bar(c):
    # 执行被装饰函数
    print(c)
    # 将被装饰函数的返回值作为新函数的返回值,还是0
    return 0

调用被装饰后的函数应该为:

>>> bar('wold')
world
0

思考

定义一个函数其实是分配一个内存空间来装代码。
decorator() 函数执行的过程就是干这个事情:
创建一个 wrap 函数,最好把函数对象的引用丢出去。
这个函数干什么嗯
它先把print('hello') 这段代码记录下来。
再看decorator 的参数 func 是哪个,去他的代码块执行它,然后把返回值返回。

[参考]
https://www.jianshu.com/p/016573e8f63e

上一篇 下一篇

猜你喜欢

热点阅读