詳解Python裝飾器

2022-10-04 17:45:10 字數 1435 閱讀 4252

1. 定義

本質是函式,用來裝飾其他函式,為其他函式新增附加功能

2. 原則

a. 不能修改被裝飾函式的源**

b. 不能修改被裝飾的函式的呼叫方式

3. 實現裝飾器知識儲備

a. 函式就是變數

b. 高階函式

i. 把乙個函式當作實參傳給另外乙個函式,在不修改被裝飾函式源**情況下為其新增功能

ii. 返回值中包含函式名, 不修改函式的呼叫方式

c. 巢狀函式

高階函式+巢狀函式==》裝飾器

# www.cppcns.comauthor: lockegogo

user, passwd = 'lk', '130914'

def auth(auth_type):

print('auth func:', auth_type)

def outher_wrapper(func):

def wrapper(*args, **kwargs):

print('wrapper func:', *args, **kwargs)

if auth_type == 'local':

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

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

if user == username and password == passwd:

print('\033[32;1muser has pas程式設計客棧sed authentication\033[0m')

res = func(*args, **kwargs)

return res

else:

exit('\033[32;1minvalid username or password\033[0m')

elif auth_type == 'ldap':

print('ldap,不會')

return wrapper

return outher_wrapper

def index():

print('welcome to index page')

@auth(程式設計客棧auth_type='local') # home = outher_wrapper(home)

def home():

print('welcome to home page'rvghfd)

rwww.cppcns.cometurn 'from home'

@auth(auth_type='ldap')

def bbs():

print('welcome to bbs page')

index()

print(home())

bbs()

decorator

本文標題: 詳解python裝飾器

本文位址:

python裝飾器 python 裝飾器詳解

def outer x def inner y return x y return inner print outer 6 5 11 如 所示,在outer函式內,又定義了乙個inner函式,並且inner函式又引用了外部函式outer的變數x,這就是乙個閉包了。在輸出時,outer 6 5 第乙個...

python裝飾器詳解 python裝飾器詳解

按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的 段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其 時,可以使用裝飾器。先來看乙個簡單的例子 def func1 functio...

詳解Python裝飾器

裝飾器的難點 在梳理了裝飾器的整個內容之後,我認為難點不是裝飾器本身,而是直接呼叫被裝飾的函式,讓人無法理解背後究竟發生了什麼。一 引出裝飾器概念 引入問題 定義了乙個函式,想在執行時動態的增加功能,又不想改動函式本身的 示例 希望對下列函式呼叫增加log功能,列印出函式呼叫 def f1 x re...