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()
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)
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()
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)
参考:https://blog.csdn.net/beyondlee2011/article/details/86556327#3__234