python装饰器

1 写装饰器的框架

# 写函数装饰器的框架
# 传入被装饰函数,
def func1(func):
    def func2():
        # 执行装饰功能后,返回函数
        # 而这里返回函数的用法就体现了闭包的思想,参数func对于func2是外部函数的变量,
        return func
    # 返回装饰函数
    return func2

# 不影响原有函数的功能,还能添加新的功能,结果就是
# func() = func2() + func()
# 使用语法糖,这里的@func1 相当于 func = func1(func)
# func1必须要定义在func函数之前才可以被装载!这一点很重要!
@func1
def func():
    return
func()
View Code

2 闭包的概念

# 闭包
# 简单来说就是一个函数定义中引用了函数外定义的变量,
# 并且该函数可以在其定义环境外被执行。这样的一个函数我们称之为闭包
def func():       # 外部函数
    a = 1         # 外部函数作用域里的变量
    print('this is func')
    def func1(num):
        print('this is func1')
        print(num + a)
    return func1
# # NameError: name 'func1' is not defined,
# # 因为func()函数调用结束的时候,里面的变量会被销毁,
# func()
# func1()
# 为了在func()函数外部也可以调用func1(),所以把func1()作为返回值
# 这时发现不仅可以调用func1(),而且可以调用外部函数作用域里的变量,
# 这时因为返回fun1的时候连那些变量一起返回了,这时的函数已经不是原先的那个函数了,
# 是带有外部函数作用域里的变量的函数,也就闭包内的闭包函数私有化了变量,这样的函数称为闭包函数
f1 = func()
f1(3)
View Code

3 装饰器的实现

def arg_func(sex):
    def func1(b_func):
        def func2():
            if sex == 'man':
                print('你不可以生娃')
            elif sex == 'woman':
                print('你可以生娃')
            return b_func()
        return func2
    return func1
# arg_func(sex='man')()() > func1
# func1() > func2
# func2() > print('你不可以生娃') or print('你可以生娃')
@arg_func(sex='man') # 注意语法糖的用法,@arg_func(sex='man') 等价于 arg_func(sex='man')(man)
def man():
    print('好好上班')

@arg_func(sex='woman')
def woman():
    print('好好上班')
man()
woman()
View Code

ttt

def logger(fn):
    def wrapper(*args, **kwargs):
        print('函数被执行了')
        res = fn(*args, **kwargs)
        print('函数执行完毕')
        return res
    return wrapper

@logger   # 等于 add = logger(add) 一定要注意这里
def add(x, y):
    return x + y
add(4,5)
View Code

参考:https://blog.csdn.net/beyondlee2011/article/details/86556327#3__234

https://blog.csdn.net/xiangxianghehe/article/details/77170585?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

https://www.cnblogs.com/zhangzhuozheng/p/8053045.html

原文地址:https://www.cnblogs.com/xxswkl/p/12702283.html