1. 程式人生 > >菜鳥學Python第十一天

菜鳥學Python第十一天

裝飾器

  • 什麼是裝飾器

    裝飾器指的是為被裝飾物件新增新功能的工具

    裝飾器本身可以是任意可呼叫物件

    被裝飾物件本身也可以是任意可呼叫物件

  • 為什麼要用裝飾器

    開放封閉原則:對修改封閉,對擴充套件開放

    裝飾器的實現原則:

    1. 不能修改被裝飾物件的原始碼

    2. 不能修改被裝飾物件的呼叫方式

    裝飾器的目的:

    就是在遵循原則1和原則2的原則的條件的情況下實現為被裝飾物件新增新功能。

  • 怎麼用裝飾器

    # 裝飾器的基本框架
    def outer(func):
        def wrapper(*args, **kwargs):  # 設定可變形參可以接收任意值
    # 此處可以新增裝飾內容(新增新功能) res = func(*args, **kwargs) # 此處可以新增裝飾內容(新增新功能),即被裝飾物件前後皆可新增功能語句 return res # 返回被裝飾物件的值,保證與被裝飾物件功能的一致性 return wrapper @outer # 語法糖,本質上是將outer(func1)的記憶體地址繫結給新的func1,func1 = outer(func1) def func1(): pass func()
    # 呼叫函式,此時的函式就是被裝飾過的函式

    語法糖:在被裝飾物件正上方加入@裝飾器名稱

  • 裝飾器使用例項

    1. 例項1

# 實現在被裝飾物件基礎上新增計時功能
import time
​
def timer(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()  # 記錄被裝飾物件執行前時間
        res = func(*args, **kwargs)
        t2 = time.time()  # 被裝飾物件執行完時間
        print
(t2 - t1) return res return wrapper @timer def welcome(): time.sleep(2) print('welcome to China') welcome()
  1. 例項2

# 給被裝飾物件新增登入認證功能
def login(func):
    def wrapper(*args, **kwargs):
        while True:
            name = input("input your name:").strip()
            pwd = input("input your password:").strip()
            if name == 'Jason' and pwd == '123':
                res = func(*args, **kwargs)
                return res
            else:
                print("name or password error!")
    return wrapper          
​
@login
def welcome(name):
    print("welcome %s to China !" % name)
    
​
welcome('Jason')