1. 程式人生 > 其它 >python學習之路:十二.裝飾器

python學習之路:十二.裝飾器

一.裝飾器的簡易版本

# 統計函式的執行時間
import time


def index():
    time.sleep(2)
    print('from index')


def home():
    time.sleep(3)
    print('from home')

def outer(func):
    # func = index

    def get_time():
        # 1. 統計一下函式執行前的時間戳
        start_time = time.time()
        func()

        # 2. 統計一下函式執行完之後的時間戳
end_time = time.time() # 3. 計算差值 print('函式執行時間:%s' % (end_time - start_time)) return get_time index = outer(index) # res=>get_time的記憶體地址 index() # get_time()

二.裝飾器進階版本

def outer(func):
    # func = index

    def get_time(*args, **kwargs):
        # 1. 統計一下函式執行前的時間戳
start_time = time.time() func(*args, **kwargs) # login() # 2. 統計一下函式執行完之後的時間戳 end_time = time.time() # 3. 計算差值 print('函式執行時間:%s' % (end_time - start_time)) return get_time login = outer(login) # res=>get_time的記憶體地址 login('ly') # get_time()
index=outer(index) index()

三.解決函式返回值的問題

def login(name):
    time.sleep(1)
    print('from home', name)
    return 'from login'

def outer(func):
    # func = index

    def get_time(*args, **kwargs):
        # 1. 統計一下函式執行前的時間戳
        start_time = time.time()
        res=func(*args, **kwargs)  # login()

        # 2. 統計一下函式執行完之後的時間戳
        end_time = time.time()

        # 3. 計算差值
        print('函式執行時間:%s' % (end_time - start_time))
        return res
    return get_time


login = outer(login)  # res=>get_time的記憶體地址
res=login('ly')  # get_time()
print(res)

四.裝飾器固定模板

def outer(func):
    def inner():
        print('函式執行之前要執行的程式碼')
        res = func()
        print('函式執行之後要執行的程式碼')
        return res

    return inner

五.裝飾器的語法糖

def outer(func):
    def inner():
        start_time = time.time()
        res = func()
        end_time = time.time()
        print('函式執行時間:%s' % (end_time - start_time))
        return res

    return inner


# 統計函式的執行時間
@outer  # # index = outer(index)
def index():
    time.sleep(3)
    print('from index')

index()
'''
    裝飾器語法糖的執行流程:
        把語法糖下面緊貼著的函式名當成引數傳遞給裝飾器函式引數
'''


@outer  # home = outer(home)
def home():
    print('from home')

home()

六.裝飾器雙層語法糖

# 統計函式執行時間的裝飾器
import time


def get_time(func):
    def inner():
        start_time = time.time()
        res = func()
        end_time = time.time()
        print('函式執行時間:%s' % (end_time - start_time))
        return res

    return inner


# 認證裝飾器
def login_auth(func):
    # func = index
    def auth():
        # 1. 讓使用者輸入使用者名稱和密碼
        username = input('username:').strip()
        password = input('password:').strip()

        # 2. 判斷使用者名稱和密碼
        if username == 'ly' and password == '123':
            func()  # inner()
        else:
            print('輸入錯誤,不能呼叫函式')

    return auth  # 一定別忘記把內層函式的函式名返回出去


@login_auth # index=login_auth(inner)  #index=>auth的記憶體地址
@get_time  # inner=get_time(index)
def index(): # def auth()
    time.sleep(2)
    print('from index')


index()  # auth()

七.有參裝飾器

# 認證裝飾器
def outter(source_data, a, b,c):
    # source_data = 'file'
    def login_auth(func):
        # func = index
        def auth( *args, **kwargs):
            # 1. 讓使用者輸入使用者名稱和密碼
            # username = input('username:').strip()
            # password = input('password:').strip()
            if source_data == 'file':
                print('從檔案中讀資料')
            elif source_data =='mysql':
                print('從mysql中讀取資料')
            elif source_data == 'oracle':
                print('從oracle中讀取資料')


        return auth  # 一定別忘記把內層函式的函式名返回出去
    return login_auth
@outter('file', 1, 2,3)  # outter('file')    @login_auth
def index():
    pass
index()