1. 程式人生 > >python裝飾器之中級篇

python裝飾器之中級篇

# Author Richard_Kong
# !/usr/bin/env python
# --*-- encoding:utf-8 --*--
"""
如果函式帶有返回值,怎麼辦?
這就是更高階的裝飾器:
1、帶引數的裝飾器:
@auth(auth_type="local")
此時它是一個函式,這種情況下 由於帶有括號,會立即執行,但是隻要它的返回值是一個裝飾器就沒問題
2、基於類的裝飾器 和 帶引數的類的裝飾器


什麼是裝飾器呢:
裝飾器:外部函式傳入被裝飾函式名,內部函式返回裝飾函式名
特點:1、不修改被裝飾函式的名稱,2、不修改被裝飾函式的原始碼
home = timmer(home),等式右側返回的是wrapper的記憶體地址,再將其賦值給home,這裡的home不再是
原來的那個函式,而是被裝飾以後的函式
像home = timmer(home)這樣的寫法,python給了我們特定的語法,@語法糖

如果一個函式被多個裝飾器修飾。那它的執行順序是由下到上
"""

def auth(auth_type):
    print("auth_type:::",auth_type)
    def outer_wrapper(func):
        def wrapper(*args,**kwargs):
            if auth_type=="local":
                username = input("please input username:")
                password = input("Please input password:")
                if username == "richard_kong" and password == "abs123":
                    print("login successful")
                    func()
                else:
                    exit("username or password is wrong!!")
            elif auth_type =="lapd":
                print("搞毛線lapd......不會!")
        return wrapper
    return outer_wrapper


@auth(auth_type="local")
def home(): # home = auth(home)
    print("from home !!!")


def abs():
    print("from abs!!!")

def login():
    print("from abs!!!")


home()