<<<<闭包所衍生的装饰器>>>>
步骤一: 本来我们只要执行下列函数,完成工作
def test():
print(' ---->diudiudiu这是本来要执行的函数<---- ')
test()
步骤二:后来,为了不修改原函数,且改变原有功能。我们会创建装饰器,
# 2> 装饰函数的创建:
def set_func(func):
def call_func():
print(' >>>>修改函数(一)<<<< ')
func() # 这个指代传入装饰函数的原函数
print(' >>>>修改函数(二)<<<< ')
return call_func
# 1> 在原函数上添加一个装饰器
@set_func # 等价于 test = set_func(test)
def test():
print(' ---->diudiudiu这是本来要执行的函数<---- ')
def main():
test()
if __name__ == '__main__':
main()
步骤三:再后来 为了在函数中添加一些带参数的函数,不得不再次修改装饰函数
# 传入带参函数:
def set_func(func):
def call_func(num):
print(' >>>>修改函数(一) + %d <<<< ' %num)
func(num) # 这个指代传入装饰函数的原函数
print(' >>>>修改函数(二) + %d <<<< ' %num)
return call_func
# 1> 在原函数上添加一个装饰器,
@set_func # 等价于 test = set_func(test)
def test(num):
print(' ---->diudiudiu这是本来要执行的函数<---- ')
def main():
test(100)
if __name__ == '__main__':
main()
步骤四:再再后来,有的时候我们不得不添加一些不定长参数或缺省参数的情况,来辅助功能运行
# 传入不定函数
def set_func(func):
def call_func(*args, **kwargs): # 代表可以传入不定长参数
print(' >>>>修改函数(一) <<<< ')
func(*args, **kwargs) # 对传入的不定长参数进行拆包,发送给原函数。不能写成 func(args, kwargs)
print(' >>>>修改函数(二) <<<< ')
return call_func
# 1> 在原函数上添加一个装饰器,
@set_func # 等价于 test = set_func(test)
def test(num, *args, **kwargs):
print(' ---->diudiudiu这是本来要执行的函数<---- %d' %num)
print(' ---->diudiudiu这是本来要执行的函数<----', args)
print(' ---->diudiudiu这是本来要执行的函数<----', kwargs)
def main():
test(100)
test(100, 200)
test(100, 200, m = 300)
if __name__ == '__main__':
main()
步骤五: 再再再口来,如果出现 带返回值的函数需要被装饰
# 装饰带返回值函数
def set_func(func):
def call_func(*args, **kwargs): # 代表可以传入不定长参数
print(' >>>>修改函数(一) <<<< ')
return func(*args, **kwargs) # 此时在装饰器中调用原函数就无法返回值,因为没有任何接收的地方,需要修改此处以便于返回
# (★★★★★老师说 这种是通用装饰器,如果原函数不加 return 那也没任何问题,但是我发现,这句话打不出来,不知道算不算问题)
print(' >>>>修改函数(二) <<<< ')
return call_func
# 1> 在原函数上添加一个装饰器,
@set_func # 等价于 test = set_func(test)
def test(num, *args, **kwargs):
print(' ---->diudiudiu这是本来要执行的函数<---- %d' %num)
print(' ---->diudiudiu这是本来要执行的函数<----', args)
print(' ---->diudiudiu这是本来要执行的函数<----', kwargs)
return '________OK!__________' # 当原函数返回一个OK的时候
def main():
# test(100, 1001, 2002, wc = '30')
a = test(100)
print(a)
if __name__ == '__main__':
main()