# -*-coding:utf-8-*-
# 想搞懂装饰器首先先得知道闭包
def function(arg):
def wapper():
return arg
return wapper
print(function(1)()) # 这个函数内层函数调用了外层函数中的变量就会产生闭包,例如左边传了个1,最后则返回1
# 若传进去的是一个函数了???势必会写成下边这样,就是不带参数装饰器
def fun01(func):
def wapper(*args, **kwargs):
print('你好')
return func(*args, **kwargs)
return wapper
@fun01
def sayhello(a):
print('{:>10}你好'.format('>>:>10'))
print(a)
"""
python中的语法糖相当于fun01(sayhello)(a) 这块稍微有点逻辑需要思考一下这个,fun01(sayhello)现在就是内层函数wapper,
sayhello的参数坑定是wapper(a),这块看不懂的话可以看看下边内层wapper参数来的原理,也是困扰了我好久
"""
sayhello('不想见')
"""
如果装饰器相加参数了,可以想象一下,上边的装饰器就属于一个整体,就可以在代码不变的情况下加功能,是不不需要做啥改变,如若想要加参数来供自己后续使用,是不只需在外层添加个方法然后返回内层函数。然后函数内部是不就可以使用这个参数了。
"""
# 带参数装饰器
def fun04(a):
def fun03(func):
def wapper(*args, **kwargs):
print('a is {:>10}'.format(a))
print(args)
return func(*args, **kwargs)
return wapper
return fun03
# 闭包原理,也是wapper参数如何来的原理---------------------------------------
def wapper(func):
return func
def func(a):
print(a)
wapper(func)(1)
# -------------------------------------------------------------------------
@fun04('大家好,我是巴啦啦小魔仙')
def all_begin(a, b):
print('全身变')
all_begin(1, 2)
参考链接:
https://www.cnblogs.com/cicaday/p/python-closure.html
https://www.cnblogs.com/cicaday/p/python-decorator.html