美文网首页
跟老奶奶说装饰器

跟老奶奶说装饰器

作者: Rooooooooong | 来源:发表于2018-10-22 22:15 被阅读0次

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

    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装饰器解释

    相关文章

      网友评论

          本文标题:跟老奶奶说装饰器

          本文链接:https://www.haomeiwen.com/subject/giagzftx.html