Python裝飾器原理與用法分析

2023-03-19 01:30:34 字數 3984 閱讀 6010

1、裝飾器的本質是函式,主要用來裝飾其他函式,也就是為其他函式新增附加功能

2、裝飾器的原則:

(1) 裝飾器不能修改被裝飾的函式的源**

(2) 裝飾器不能修改被裝飾的函式的呼叫方式

3、實現裝飾器的知識儲備

(1) python中函式即‘變數'

a、變數在python中的儲存

x='tomwenxing'

y=x[說明]:

當python直譯器遇到語句x='tomwenxing'時,它主要完成了兩樣工作:

1.在記憶體中開闢了一片空間用來儲存字串‘tomwenxing'

2.在記憶體從建立了一個名為x的變數,並用它指向字串‘tomwenxing'所佔據的記憶體空間(可以理解為房間和房間號的關係)

而語句y=x意為將變數x對字串的引用賦值給變數y,即在記憶體中建立一個變數y,並使其指向變數x所指向的記憶體空間

b、函式在python中的儲存

def test():

pass

[說明]:

在python中,函式的儲存和變數相似,以上面的函式為例,python解釋其主要做兩件事:

1.在記憶體中開闢一個記憶體空間,用來儲存函式**的字串(本例中**只有一句:pass)

2.在記憶體中建立一個變數test,用來指向儲存函式**字串的記憶體空間(相當於test=‘函式體')

因此說在python中函式即變數

(2) 高階函式(下面兩個條件滿足任何一個即為高階函式)

a、把一個函式名當做實參傳遞給另外一個函式

[對裝飾器的影響]:達到“在不修改被裝飾函式源**的情況下為其新增功能”的效果

import time

def bar():

time.swww.cppcns.comleep(2)

print('in the bar')

def test(func):

start_time=time.time()

func()

stop_time=time.time()

print('函式的執行時間為:',stop_time-start_time)

test(bar)

執行結果:

in the bar

函式的執行時間為: 2.0021145343780518

b、返回值中包含函式名

[對裝飾器的影響]:達到“不改變函式的呼叫方式“的效果

import time

def bar():

time.sleep(3)

print('in the bar')

def test2(func):

print('新新增的功能')

return func

bar=test2(bar)

bar()

執行結果:

新新增的功能

in the bar

(3) 巢狀函式:在一個函式體內用def去宣告一個新的函式(不是呼叫)

def foo():

print('in the foo')

def bar(): #宣告一個新的函式,而不是呼叫函式

print(程式設計客棧'in the bar')

bar()

foo()

執行結果:

in the foo

in the bar

4、裝飾器的語法:高階函式+巢狀函式=》裝飾器 (下面的例子可以用pycharm程式設計客棧的偵錯程式除錯一下,看看**的執行順序)

import time

def timer(func):

def deco(*args,**kwargs):#使用了不定引數

start_time=time.time()

res=func(*args,**kwargs) #執行函式

stop_time=time.time()

print('執行時間:',stop_time-start_time)

return res # 若無返回值,則返回none

return deco

@timer #等價於test1=timer(test1)=deco,即test1()=deco()

def test1():

time.sleep(3)

print('in the test1')

@timer #等價於test2=timer(test2)=deco,即test2(name)=deco(name)

def test2(name):

time.sleep(3)

print('in the test2',name)

test1()

print('-------------分界線------------------------')

test2('tomwenxing')

執行結果:

in the test1

執行時間: 3.0001718997955322

-------------分界線------------------------

in the test2 tomwenxing

執行時間: 3.000171422958374

5、帶引數的裝飾器

# -*- coding:utf-8 -*-

user,passwd='tomwenxing','123'

#如裝飾器帶引數,一般是三層巢狀

def auth(auth_type): #第一層的引數是裝飾器的引數

def outer_wrapper(func):#第二層的引數是裝飾器要裝飾的目標函式

def wrapper(*args,**kwargs):#第三次的引數是目標函式的引數

if auth_type=='local':

username = input('username:').strip()

程式設計客棧 password = input('password:').strip()

if user == username and passwd == password:

print('使用者tomwenxing已經成功登入!')

res = func(*args, **kwargs) #執行目標函式

return res

else:

exit('使用者名稱或密碼有錯誤')

elif auth_type=='ldap':

print('暫不支援這種登入方式!')

return wrapper

return outer_wrapper

def index():

print('歡迎來到index頁面')

@auth(auth_type='local') #home=wrapper()

def home(name):

print('%s,歡迎來到home頁面' %name)

return 'this is home page'

@auth(auth_type='ldap')

def bbs():

print('歡迎來到bbs頁面 ')

index()

print('----------------------分界線-------------------')

print('函式的返回值為:',home('wenxing'))

print('----------------------分界線-------------------')

bbswww.cppcns.com()

執行結果:

歡迎來到index頁面

----------------------分界線-------------------

username:tomwenxing

password:123

使用者tomwenxing已經成功登入!

wenxing,歡迎來到home頁面

函式的返回值為: this is home page

----------------------分界線-------------------

暫不支援這種登入方式!

python裝飾器原理

裝飾器作用 裝飾器在實際開發中應用廣發,如 1.引入日誌 2.函式執行時間統計 3.執行函式前預備處理 4.執行函式後清理功能 5.許可權校驗等場景 6.快取 裝飾器可以實現在不修改之前已經寫好並且封裝好的 的前提下對之前的 進行功能上的拓展 在實際開發中應用十分廣泛,用好了裝飾器,開發效率如虎添翼...

Python裝飾器用法及原理

python語言有一個比較pythonic的功能,也是一個具有很強大功能的特性,那就是裝飾器。python中的裝飾器是通過利用了函式特性的閉包實現的,所以我們需要了解python閉包的原理,以及函式的功能特性。1.1 函式特性def add x return x 1a add 5 print a 執...

python裝飾器裝飾原理探祕

最近一直沒抽出時間來寫部落格,這篇部落格在草稿箱裡面躺了好久了,一直都只有一個標題。現在終於要開始寫了。為什麼要寫這個篇文章 什麼是裝飾器 裝飾器 decorator 個人理解裝飾器無非就是一個函式,函式的功能是傳入一個源函式,丟回來一個包含原函式功能的閉包來替代原函式以供呼叫 就是改變了函式名變數...

裝飾器原理

先寫個非常簡單的裝飾器 def w1 main func def outer request,kargs print before 這裡可實現驗證功能 main func request,kargs print after 這裡可以實現如果main func不能成功執行之後的操作 return ma...

python 裝飾器函式與裝飾器類

在不改變原有 的情況下增加新功能 from functools import wraps def decortor func wraps func 段 return func args,kwargs decortor 相當於 decortor test def test print test.nam...

python核心 裝飾器的用法

裝飾器是程式開發過程中經常會用到的一個功能,用好裝飾器,開發效率就會如虎添翼 引入日誌,函式執行時間統計,執行前函式預備處理,執行後函式清理功能,許可權校驗等功能 要想學好裝飾器,需要了解什麼是閉包 在函式內部再定義一個函式,並且這個函式用到了外面函式的變數,那麼將這個函式以及用到的一些變數稱之為閉...

python裝飾器高階用法

1.裝飾類 下面,直接來看 是如何實現裝飾類的 def decorator aclass class newclass def init self,age self.total display 0 defdisplay self self.total display 1 print total di...

Python裝飾器實現原理

python中的裝飾器是通過利用了函式特性的閉包實現的,所以在講裝飾器之前,我們需要先了解函式特性,以及閉包是怎麼利用了函式特性的 python中的函式特性總的來說有以下四點 1.函式作為變數傳遞 def add x return x 1 a add 作為變數說明 函式如果不加括號,是不會執行的,代...

python中裝飾器的原理

裝飾器這玩意挺有用,當時感覺各種繞,現在終於繞明白了,俺滴個大爺,還是要慢慢思考才能買明白各種的真諦,沒事就來繞一繞 def outer func def inner print 認證成功 result func print 登入成功 return result return inner outer...

裝飾器原理與遞迴

一個簡單的裝飾器 無引數傳遞 def hi fun definner print welcome fun return inner hidef hello print hello world hello 裝飾器工作原理 1,是裝飾器符號,在這裡裝飾器實施下列工作 1.1 把被裝飾函式的函式名作為實參...