裝飾器:在不修改被裝飾器物件源**以及呼叫方式的前提下為被裝飾物件新增新功能
源**:
import time
def index(x, y):
time.sleep(3)
print('index %s %s' % (x, y))
index(1111, 2222)
新增需求,增加起始時間,算出間隔時間
方式一:
缺點:沒有修改被裝飾物件的呼叫方式,但是修改了源**
import time
def index(x, y):
start = time.time()
time.sleep(3)
print('index %s %s' % (x, y))
stop = time.time()
print(stop - start)
index(1111, 2222)
方式二:
缺點:沒有修改被裝飾物件的呼叫方式 ,也沒有修改源**,加上了新功能,但是**冗餘
import time
def index(x, y):
time.sleep(3)
print(f'index ')
start = time.time()
index(1111, 2222)
stop = time.time()
print(stop - start)
start = time.time()
index(1111, 2222)
stop = time.time()
print(stop - start)
方式三:
缺點:雖然解決了方式二**冗餘問題,但是帶來了乙個新問題即函式的呼叫方式改變了
import time
def index(x, y):
time.sleep(3)
print('index {} {}'.format(x, y))
start = time.time()
index(1111, 2222)
stop = time.time()
print(stop - start)
方式四:
優點:將index的引數寫活了,不受引數個數限制
import time
def index(x, y, z):
time.sleep(3)
print(f'index ')
start = time.time()
index(*args, **kwargs) # index(1, z=3, y=2)
stop = time.time()
print(stop - start)
方式五:
優點:在方式四的基礎上把裝飾器物件寫活了,在原來只能裝飾index
import time
def index(x, y, z):
time.sleep(3)
print(f'index ')
def home(a):
time.sleep(1)
print(f'這是乙個home函式,它的引數是: ')
def outter(func):
start = time.time()
func(*args, **kwargs)
stop = time.time()
print(stop - start)
index = outter(index)
home = outter(home)
index(1, 2, 3)
home('winnie')
import time
def index(x, y, z):
time.sleep(3)
print(f'index ')
def home(a):
time.sleep(1)
print(f'這是乙個home函式,它的引數是: ')
def outter(func):
start = time.time()
func(*args, **kwargs)
stop = time.time()
print(stop - start)
index(1, 2, 3)
home('winnie')
方式七:
優點:語法糖
import time
def outter(func):
start = time.time()
func(*args, **kwargs)
stop = time.time()
print(stop - start)
# 在被裝飾物件正上方的單獨一行寫@裝飾器名字
@outter # 相當於 index=outter(index)
def index(x, y, z):
time.sleep(3)
print(f'index ')
@outter # 相當於 home=outter(home)
def home(a):
time.sleep(1)
print(f'這是乙個home函式,它的引數是: ')
index(1, 2, 3)
home('winnie')
無參裝飾器
def index x,y print x,y index args,kwargs index y 222,x 111 可以把函式當做引數傳入 可以把函式當做返回值返回 def index return 123 def foo func return func foo index def outte...
python裝飾器 有殘裝飾器 無參裝飾器
裝飾器 修飾別人的工具,修飾新增功能,工具指的是函式 裝飾器本身可以是任何可呼叫物件,被裝飾的物件也可以是任意可呼叫物件 為什麼要用裝飾器 開放封閉原則 對修改是封閉的,對擴充套件是開放的 裝飾器就是為了在不修改被裝飾物件的源 以及呼叫方式的前提下,為期新增新功能 基本裝飾器 usr bin pyt...
無參裝飾器函式和帶參裝飾器函式
python裝飾器 下邊幾個裝飾器帶引數和不帶引數例子詳解 我們都知道,python中函式是可以被當做引數進行傳遞的,所以最直接的裝飾器例項如下 def decorator func 裝飾器函式 print welcome func print end def test print hello wo...