装饰器的雏形(有返回值,最终版):
def wapper(fn): # wapper:装饰,fn:目标函数
def inner():
# 在目标函数执行前做一些操作
ret = fn() # 执行目标函数
# 在目标函数后执行一些操作
return ret
return inner # 千万别加(),加了相当于执行这个函数,我们只是做了一个返回
然后使用装饰器
@wapper
def tartet():
pass
---------------------------------------------------------------------
def guanjia(game):
def inner(*args,**kwargs):
print('打开外挂')
ret = game(*args,**kwargs)
print('关闭外挂')
return ret
return inner
@guanjia # play_dnf = guanjia(play_dnf)
def play_dnf (username,password):
print('我要开始玩dnf了',username,password)
print('正在玩DNF中。。。')
return '+++获得经验+++'
ret = play_dnf('admin','12345')
print(ret) # 这里打印装饰器里return的值ret,打印:+++获得经验+++,(return的东西如果肉眼可见要用print)
输出>>
打开外挂
我要开始玩dnf了 admin 12345
正在玩DNF中。。。
关闭外挂
+++获得经验+++
---------------------------------------------------------------------------------------------------------------
一个函数被多个装饰器装饰
@wapper1
@wapper2
def target()
print ('目标函数')
规则和规律 wapper1 wapper2 target wapper2 wapper1
def wapper1(fn):
def inner(*args,**kwargs):
print('这里是wapper1 进') # 1
ret = fn(*args,**kwargs) # 这里装饰的是wapper2,所以跳到wapper2函数
print('这里是wapper1 出') # 5
return ret
return inner
def wapper2(fn):
def inner(*args,**kwargs):
print('这里是wapper2 进') # 2
ret = fn(*args,**kwargs) # 这里是最开始装饰的target,所以打印:这里是target函数
print('这里是wapper2 出') # 4
return ret
return inner
@wapper1 # 2.在装饰1,target = wapper1(wapper2.inner)
@wapper2 # 1.先装饰2,target = wapper2(target) → target:wapper2.inner
def target():
print('这里是target函数') # 3
target()
输出:
这里是wapper1 进
这里是wapper2 进
这里是target函数
这里是wapper2 出
这里是wapper1 出