python重點之裝飾器

2022-04-10 20:22:03 字數 3524 閱讀 1636

器指的是工具,可以定義成成函式

裝飾指的是為其他事物新增額外的東西點綴

合到一起的解釋:

裝飾器指的定義乙個函式,該函式是用來為其他函式新增額外的功能

開放封閉原則

開放:指的是對拓展功能是開放的

封閉:指的是對修改源**是封閉的

裝飾器就是在不修改被裝飾器物件源**以及呼叫方式的前提下為被裝飾物件新增新功能

需求:在不修改index函式的源**以及呼叫方式的前提下為其新增統計執行時間的功能

def index(x,y):

time.sleep(3)

print('index %s %s' %(x,y))

index(111,222)

# index(y=111,x=222)

# index(111,y=222)

解決方案一:失敗

問題:沒有修改被裝飾物件的呼叫方式,但是修改了其源**

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(111,222)

解決方案二:失敗

問題:沒有修改被裝飾物件的呼叫方式,也沒有修改了其源**,並且加上了新功能,但是**冗餘

import time

def index(x,y):

time.sleep(3)

print('index %s %s' %(x,y))

start=time.time()

index(111,222)

stop=time.time()

print(stop - start)

解決方案三:失敗

問題:解決了方案二**冗餘問題,但帶來乙個新問題即函式的呼叫方式改變了

import time

def index(x,y):

time.sleep(3)

print('index %s %s' %(x,y))

start=time.time()

index(111,222)

stop=time.time()

print(stop - start)

方案三的優化一:將index的引數寫活了

import time

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

start=time.time()

index(*args,**kwargs) # index(3333,z=5555,y=44444)

stop=time.time()

print(stop - start)

方案三的優化二:在優化一的基礎上把被裝飾物件寫活了,原來只能裝飾index

import time

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

def home(name):

time.sleep(2)

print('welcome %s to home page' %name)

def outter(func): # func = index的記憶體位址

start=time.time()

func(*args,**kwargs) # index的記憶體位址()

stop=time.time()

print(stop - start)

home('egon')

# home(name='egon')

import time

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

def home(name):

time.sleep(2)

print('welcome %s to home page' %name)

def outter(func):

start=time.time()

res=func(*args,**kwargs)

stop=time.time()

print(stop - start)

return res

home=outter(home)

print('返回值-->',res)

大方向:如何在方案三的基礎上不改變函式的呼叫方式

import time

裝飾器def timmer(func):

start=time.time()

res=func(*args,**kwargs)

stop=time.time()

print(stop - start)

return res

# 在被裝飾物件正上方的單獨一行寫@裝飾器名字

# @timmer # index=timmer(index)

def index(x,y,z):

time.sleep(3)

print('index %s %s %s' %(x,y,z))

# @timmer # home=timmer(ome)

def home(name):

time.sleep(2)

print('welcome %s to home page' %name)

index(x=1,y=2,z=3)

home('egon')

疊加多個裝飾器,載入順序與執行順序

def index():

pass

res1=func1(*args,**kwargs)

return res1

res2=func2(*args,**kwargs)

return res2

def deco3(x):

def outter3(func3): # func3=被裝飾物件index函式的記憶體位址

res3=func3(*args,**kwargs)

return res3

return outter3

# 載入順序自下而上(了解)

def index(x,y):

print('from index %s:%s' %(x,y))

def outter(func):

# 1、呼叫原函式

# 2、為其增加新功能

res=func(*args,**kwargs)

return res

index = outeer(index)

python裝飾器詳解(重點)

你會python嘛?我會!那你給我講下python裝飾器吧!python裝飾器啊?我沒用過哎 簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓...

python裝飾器介紹 Python之裝飾器簡介

python函式式程式設計之裝飾器 1.開放封閉原則 簡單來說,就是對擴充套件開放,對修改封閉。在物件導向的程式設計方式中,經常會定義各種函式。乙個函式的使用分為定義階段和使用階段,乙個函式定義完成以後,可能會在很多位置被呼叫。這意味著如果函式的定義階段 被修改,受到影響的地方就會有很多,此時很容易...

python 找到裝飾器 Python之裝飾器

裝飾器本質上就是乙個python函式,他可以讓其他函式在不需要做任何 變動的前提下,增加額外的功能,裝飾器的返回值也是乙個函式物件。裝飾器的作用 在不改變原函式及原函式的執行的情況下,為原函式增加一些額外的功能,比如列印日誌 執行時間,登入認證等等。乙個簡單的裝飾器 import time def ...