Python之裝飾器(綜合練習)

2021-09-10 15:40:09 字數 4196 閱讀 6839

裝飾器

案例1:

建立裝飾器,要求如下:

1. 建立add_log裝飾器,被裝飾的函式列印日誌資訊;

**:

import time

import functools

# 定義裝飾器

def add_log(fun):

# 保留被裝飾函式的函式名和幫助資訊文件

@functools.wraps(fun)

def inter(*args,**kwargs):

# time.time(): 秒數

start_time = time.time()

# 由於被裝飾函式有返回值

res = fun(*args,**kwargs)

end_time = time.time()

# 執行返回值結果:即為函式的返回值,fun.__name__:返回函式名

%(time.ctime(),fun.__name__,end_time - start_time,res))

# 所以必須return返回函式返回值

return res

return inter

# 新增裝飾

@add_log

# 定義被裝飾函式(求任意兩個數的和)

def add(x,y):

# 休眠1秒

time.sleep(1)

return x+y

# 呼叫函式

print(add(1,10))

# 輸出時間; time.ctime():以正常的格式顯示時間

# print(time.ctime())

執行結果:

案例2:

需求:

僅root使用者可以有許可權執行以下函式,當普通使用者執行時會報錯

inspect.getcallargs(函式名,引數):以字典的形式返回函式的引數 ( )

get方法:返回字典指定key的value值

**:

import functools

import inspect

# 定義裝飾器

def is_root(fun):

@functools.wraps(fun)

# inspect.getcallargs:以字典的形式返回函式的引數

# key值為:形參,value值為:形參對應的實參

inspect_res = inspect.getcallargs(fun,*args,**kwargs)

print('inspect_res的返回值為:%s' % inspect_res)

# get方法:返回字典指定key的value值

if inspect_res.get('name') == 'root':

res = fun(*args,**kwargs)

return res

else:

print('error:you are not a root user')

# 新增裝飾

@is_root

# 定義被裝飾的函式

def add_student(name):

print('新增學生資訊...')

# 呼叫函式

add_student('westos')

執行結果:

改進:(需要用到多個裝飾器)

先讓使用者登陸,再判斷使用者是否由許可權執行新增資訊功能
**:

import functools

import inspect

userlist = ['root','admin','student']

# 定義裝飾器1(判斷使用者是否登陸成功)

def user_login(fun):

@functools.wraps(fun)

def logins(*args,**kwargs):

for i in args:

if i not in userlist:

print('error:登陸失敗')

else:

print('登陸成功')

res = fun(*args,**kwargs)

return res

return logins

# 定義裝飾器2(判斷使用者是否為root使用者)

def is_root(fun):

@functools.wraps(fun)

# inspect.getcallargs:以字典的形式返回函式的引數

# key值為:形參,value值為:形參對應的實參

inspect_res = inspect.getcallargs(fun,*args,**kwargs)

print('inspect_res的返回值為:%s' % inspect_res)

# get方法:返回字典指定key的value值

if inspect_res.get('name') == 'root':

res = fun(*args,**kwargs)

return res

else:

print('error:you are not a root user')

# 新增裝飾(裝飾器的內部功能函式從上到下依次執行)

@user_login

@is_root

# 定義被裝飾的函式

def add_student(name):

print('新增學生資訊...')

# 呼叫函式

add_student('admin')

執行結果:

案例3:

編寫裝飾器required_ints, 條件如下:

1). 確保函式接收到的每乙個引數都是整數;

type(s) # 輸出s的型別

isinstance(s,str) # 判斷s是否為字串型別

2). 如果引數不是整形數,丟擲異常: 引數必須為整形;

raise typeerror(「引數必須為整形」)

**:

import functools

# 定義裝飾器

def required_ints(fun):

@functools.wraps(fun)

# 遍歷整個想要求和的元組

for i in args + tuple(kwargs.values()):

# 判斷每個元素是否為整型,如果不是,則丟擲異常

if not isinstance(i,int):

# raise typeerror(): 丟擲異常

raise typeerror('引數必須為整形')

else:

# 呼叫函式,並返回函式返回值

res = fun(*args,**kwargs)

return res

# 新增裝飾

@required_ints

# 定義被裝飾函式:

# *args:可變引數 **kwargs:關鍵字引數

def add(*args,**kwargs):

# args:字典型別 kwargs.values():元組型別

# 由於資料型別不同,所以不能直接用+來連線,必須先轉換資料型別

return sum(args + tuple(kwargs.values()))

# 注意:如果有字典型別的實參,則必須寫在最後邊

python 裝飾器練習

import time import functools def add log fun functools.wraps fun start time time.time res fun args,kwargs end time time.time fun.name end time start t...

Python裝飾器練習

看廖下廖大的裝飾器的文件 寫了練習 設計乙個decorator,它可作用於任何函式上,並列印該函式的執行時間 coding utf 8 import time,functools def metric fn time1 time.time ret fn args,kw time2 time.time...

python裝飾器練習

判斷是否是root使用者 def hahaha fc def woshinima args if args 0 root args是列表,儘管只有乙個元素,但是必須是 0 return fc args print error return woshinima hahaha def add stude...