1. 程式人生 > >python學習5_裝飾器

python學習5_裝飾器

else ces spa lda 功能 lease python學習 rom ==

裝飾器需要掌握以下知識點:

1.為被裝飾對象提供新功能的工具

2.裝飾器本身、被裝飾對象可以是任意可調用對象

3.軟件一旦上線後,應該對修改封閉,對擴展開放

4.原則:

  • 不修改被裝飾對象的源代碼
  • 不修改被裝飾對象的調用方式
5.示例代碼1無參裝飾器:用裝飾器(outter)實現統計一個函數(inner)的執行時間
#示例代碼1
import time


# 裝飾器
def outter(func):

    def wrapper(*args, **kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        end_time 
= time.time() print(run time is %s % (end_time - start_time)) return res return wrapper # 被裝飾函數 @outter # inner = outter(inner) def inner(): print("This is inner.") time.sleep(3) @outter # home = outter(home) def home(name): print(welcome %s %name) time.sleep(
2) return 123 inner() print(-----) home(cooky)

6.示例代碼2:裝飾器模板

#示例代碼2
def outter(func):
    def inner(*args, **kwargs):
        res = func(*args, **kwargs)
        return res
    return inner

7.示例代碼3無參裝飾器:模擬實現用戶驗證

#示例代碼3
import time
current_userinfo = {user:None}


def outter(func):
    
def wrapper(*args, **kwargs): if current_userinfo[user]: return func(*args, **kwargs) user = input(please input your username:).strip() pwd = input(please input your password:).strip() if (user == cooky and pwd == 123): print(login successfully) current_userinfo[user] = user res = func(*args, **kwargs) return res else: print(login failed) return wrapper @outter def inner(): print("This is inner.") time.sleep(3) @outter def home(name): print(welcome %s %name) time.sleep(2) return inner() home(cooky)

8.示例代碼4:多個裝飾器的執行順序:語法自下而上解析,執行過程為從上到下。記住結論為自上而下執行代碼就可以了

@outter1 @outter2 def index(): print(‘this is index‘)
#示例代碼4
def outter1(func):
    print(2.this is outter1)

    def wrapper1(*args, **kwargs):
        print(3.this is wrapper1)
        res = func(*args, **kwargs)
        return res
    return wrapper1


def outter2(func):
    print(1.this is outter2)

    def wrapper2(*args, **kwargs):
        print(4.this is wrapper2)
        res = func(*args, **kwargs)
        return res
    return wrapper2


@outter1
@outter2
def index():
    print(5.this is index)


index()

9.示例代碼5:有參裝飾器

#示例代碼5
import time

current_userinfo={user:None}

def auth(engine = file):
    def outter(func):
        def wrapper2(*args, **kwargs):
            if engine == file:
                if current_userinfo[user]:
                    return func(*args, **kwargs)
                user = input(please input your username:).strip()
                pwd = input(please input your password:).strip()
                if (user == cooky and pwd == 123):
                    print(login successfully)
                    current_userinfo[user] = user
                    res = func(*args, **kwargs)
                    return res
                else:
                    print(login failed)
                elif engine == mysql:
                    print(mysql認證機制)
                elif engine == ldap:
                    print(ldap的認證機制)
                else:
                    print(不支持改engine)
            return wrapper2
    return outter


@auth(engine = ldap)
def index():
    print(welcome to index page)
    time.sleep(3)

index()

10.示例代碼6:wraps裝飾器實現原始函數的文檔和裝飾後函數的文檔一致

#示例代碼6
from functools import wraps

def outter(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        return res
    return wrapper


@outter
def inner():
    """
    this is inner‘s document
    :return:
    """
    print(this is inner)


print(help(inner))
print(inner.__name__)

python學習5_裝飾器