跟老奶奶说装饰器

本文将用通俗易懂的方式阐述装饰器,欢迎指正~

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

参考
这是我见过的最全面的Python装饰器解释

你可能感兴趣的:(跟老奶奶说装饰器)