python函式裝飾器

2021-09-13 16:10:51 字數 3708 閱讀 9200

1、定義:裝飾器,就是把乙個函式當作引數,返回乙個替代版的函式

本質上就是乙個返回函式的函式

2、作用:在不改變原函式的基礎上給函式增加功能

3、裝飾器

如:

def outer(func):  					##()中是要裝飾的函式,此函式名和任意,即引數

def inner(): ##定義的要裝飾的內容的函式

print('*********') ##要裝飾的內容

func() ##執行要裝飾的函式

return inner() ##返回inner,就是返回裝飾後的函式

@outer ##語法糖 (在不用改變原函式的情況下,修改函式的輸出結果)

def shuchu():

print('wa ha ha')

@outer

def lizi():

print('hello world')

例子:

def outer(func):

def inner(age):

if age<0:

age = 0

else:

age= age

func(age)

return inner

@outer

def say(age):

print('name is %d years old' %(age))

say(10)

say(-10)

例子:

def desc(fun):

def add_info():

print('節日快樂')

fun()

print('下次來玩')

return add_info

@desc

def login():

print('login...')

login()

例子,裝飾器實現函式計時器

import random

import string

import time ##匯入計時器模組

import functools ##匯入對裝飾器裝飾的模組

li = [random.choice(string.ascii_letters)for i in range(100)]

def timeit(fun): ##括號中即要裝飾的函式引數,可隨意,但在裝飾器中必須統一

@functools.wraps(fun) ##對裝飾器進行裝飾,保留被裝飾函式的函式名和幫助資訊文件

start_time = time.time() ##開始時間

res= fun(*args,**kwargs) ##執行函式,當被裝飾的函式有返回值時,需要對返回值進行接收

end_time = time.time() ##結束時間

print('執行時間為: %.6f' %(end_time - start_time))

return res ##對接收的返回值進行返回

@timeit

def con_add():

s =''

for i in li:

s+=(i+',')

print(s)

#con_add()

@timeit

def join_add():

print(','.join(li))

#join_add()

@timeit

def fun_list(n):

"""這是fun_list函式,被itemit裝飾"""

return [2 * i for i in range(n)]

@timeit

def fun_map(n):

"""這是fun_map函式,被timeit裝飾"""

return list(map(lambda x:x*2,range(n)))

print(fun_list.__name__) ##顯示函式名

print(fun_list.__doc__) ##顯示函式文件

print(fun_map.__name__)

print(fun_map.__doc__)

例子: 建立裝飾器, 要求如下:

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

import time

import functools

#print(time.ctime()) ##顯示字串時間time.ctime()

def add_log(fun):

@functools.wraps(fun)

start_time = time.time()

res = fun(*args, **kwargs)

end_time = time.time()

return res

@add_log

def fun_list(n):

return [2 * i for i in range(n)]

fun_list(5)

4、多個裝飾器時候,是自上到下執行的

def wang_a(fun):

def inner_a(*args,**kwargs):

print('a')

return fun(*args,**kwargs)

return inner_a

def wang_b(fun):

def inner_b(*args,**kwargs):

print('b')

return fun(*args,**kwargs)

return inner_b

@wang_b

@wang_a

def f(x):

print('wanghaha')

return x*2

f(1)

輸出結果先b 後a

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

temp = fun(*args,**kwargs)

return temp

else:

print('not root user,no permission add student')

login_session = ['root','admin','redhat'] ##判斷登陸

def is_login(fun):

@functools.wraps(fun)

if args[0] in login_session:

temp = fun(*args,**kwargs)

return temp

else:

print('error: %s未登陸' %(args[0]))

@is_login

@is_admin

def add_student(name):

print('please input student information:')

add_student('root')

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...

python 裝飾器 函式裝飾器 類裝飾器

python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...

python裝飾器 裝飾器工廠函式

使用裝飾器實現如下所示的列印 小白聯盟def printequel func1 def inner1 print 15 func1 return inner1 def printstar func2 def inner2 print 15 func2 return inner2 printequel...