本文将用通俗易懂的方式阐述装饰器,欢迎指正~
1.没有装饰器以前,代码冗余
def deposit():
print("存款中...")
def withdrawl():
print("取款中...")
def check_password(func):
print("密码验证中...")
func()
button = 1
if button ==1:
check_password(deposit)
else:
check_password(withdrawl)
>>>
密码验证中...
存款中...
2. 装饰器出厂
def check_password(func):
def deco():
print("密码验证中...")
func()
return deco
@check_password
def deposit():
print("存款中...")
def withdrawl():
print("取款中...")
deposit()
>>>
密码验证中...
存款中...
withdrawl()
>>>
存款中...
w = check_password(withdrawl)
w()
>>>
密码验证中...
存款中...
(1)思考为什么deposit()和withdrawl()的结果不一样?
这就是@check_password的作用
(2)思考为什么deposit()和w()的结果一样?
这就说明@check_password在功能上和w = check_password(withdrawl)是一致的。
下面解释这个现象,withdraw当做参数传入deco()函数中,什么也没有return,只是print了一句话。然后check_password()函数将deco函数return出来了。不妨这么理解,形参func化妆后的函数是deco。
所以这个过程就是:check_password()将func传进来,并化了妆,之后送出去变成了deco,本质没变。
若还没有理解,敲敲如下代码,便会明了。
3. 为装饰器添加参数
def func_(func):
def deco(x):
print("为装饰器添加参数")
func(x)
return deco
@func_
def myfun(x):
print(x)
myfun("python day day up")
>>>
为装饰器添加参数
python day day up
4. 为装饰器添加跟多参数
def func_more(func):
def deco(*args,**kwargs):
print("添加更多的参数")
out = func(*args,*kwargs)
return out
return deco
@func_more
def myfun(a,b):
out = a**b
return out
myfun(3,2)
>>>
添加更多的参数
9
网友评论