原則:對修改是封閉的,對擴展是開放的,
方法:通常不修改函數或者類,而是擴展函數或者類
一:裝飾器
容許咱們將一個提供核心功能的對象和其餘能夠改變這個功能的對象’包裹‘在一塊兒,
使用裝飾對象的任何對象與裝飾先後該對象的交互遵循徹底相同的方式
二:裝飾器的用途
(1)加強一個組件向另外一個組件發送數據時的響應能力
(2)支持多種可選行爲
(3)對一個單元作代碼上的修改(即代碼的複用)
1 import time 2 3 # ----------------------------------------------------------------# 4 # 裝飾器一 5 # ----------------------------------------------------------------# 6 7 8 def f1(): 9 print("Local time is ") 10 # print(time.time()) 11 12 13 def f2(): 14 print("Local time is ") 15 # print(time.time()) 16 17 18 f1() 19 f2() 20 21 # 給每個函數添加一個打印當前時間,作下面的修改,沒有違反修改是封閉的原則 22 23 24 def print_current_time(func): 25 print(time.time()) 26 func() 27 28 29 print_current_time(f1) 30 print_current_time(f2) 31 32 # 拋出問題 打印時間是函數自己的,並非強加函數 33 34 # ----------------------------------------------------------------# 35 # 裝飾器二 36 # ----------------------------------------------------------------# 37 38 39 def decorator(func): 40 def wrapper(): # 被封裝的意思 41 print(time.time()) 42 func() 43 return wrapper 44 45 46 def f1(): 47 print("This is a function:") 48 49 50 f = decorator(f1) # 將函數f1裝飾 51 f() # 執行裝飾後的結果 52 53 54 # ----------------------------------------------------------------# 55 # 裝飾器三 56 # ----------------------------------------------------------------# 57 58 59 def decorator(func): 60 def wrapper(): # 被封裝的意思 61 print(time.time()) 62 func() 63 return wrapper 64 65 66 @decorator 67 def f1(): 68 print("This is a function:") 69 70 71 f1() # 不改變函數的調用 72 73 74 # ----------------------------------------------------------------# 75 # 裝飾器四 76 # ----------------------------------------------------------------# 77 78 def hello(fn): # fn爲回調函數 79 def wrapper(): 80 print('hello, %s' % fn.__name__) 81 fn() 82 print('goodbye, %s' % fn.__name__) 83 return wrapper 84 85 86 @hello 87 def foo(): 88 print("I am a foo") 89 90 91 foo() 92 93 94 # ----------------------------------------------------------------# 95 # 裝飾器五之裝飾器終極形態 96 # ----------------------------------------------------------------# 97 98 99 def decorator(func): 100 def wrapper(*func_name, **kw): # 被封裝的意思 101 print(time.time()) 102 func(*func_name, **kw) # 處理抽象函數 103 return wrapper 104 105 106 @decorator 107 def f_1(func_name): 108 print("This is a function:" + func_name) 109 110 111 @decorator 112 def f_2(func_name1, func_name2): # 多參數函數 113 print("This is a function:" + func_name1 + func_name2) 114 115 116 @decorator 117 def f_3(func_name1, func_name2, **kw): 118 print("This is a function:" + func_name1 + func_name2) 119 print(kw) 120 121 122 def f_4(func_name1, func_name2, **kw): 123 print("This is a function:" + func_name1 + func_name2) 124 print(kw) 125 126 127 f_1('qqq') # 不改變函數的調用 128 f_2('aa', 'dd') 129 f_4('aa', 'dd', a=1, b=2, c=3) 130 f_3('aa', 'dd', a=1, b=2, c=3)
一步一步理解裝飾器,裝飾器特別好用!app