python 裝飾器詳解

2022-08-23 00:27:13 字數 1626 閱讀 7571

裝飾器

裝飾器其實就是乙個閉包,把乙個函式當做引數然後返回乙個替代版函式

裝飾器有2個特性:

一是可以把被裝飾的函式替換成其他函式, 

二是可以在載入模組時候立即執行

def w1(func):

def inner():

# 驗證1

# 驗證2

# 驗證3  

func()

return inner

@w1def f1():

print('f1')

裝飾器(decorator)功能

1. 引⼊⽇志

2. 函式執⾏時間統計

3. 執⾏函式前預備處理

4. 執⾏函式後清理功能

5. 許可權校驗等場景

6. 快取 

from time import ctime, sleep

def timefun(func):

print("%s called at %s"%(func.__name__, ctime()))

print(a, b)

func(a, b)

@timefun

def foo(a, b):

print(a+b)

foo(3,5)

sleep(2)

foo(2,4)

裝飾器對不定長引數函式進行裝飾

from time import ctime, sleep

def timefun(func):

print("%s called at %s"%(func.__name__, ctime()))

func(*args, **kwargs)

@timefun

def foo(a, b, c):

print(a+b+c)

foo(3,5,7)

sleep(2)

foo(2,4,9)

裝飾器對帶有返回值的函式進行裝飾

from time import ctime, sleep

def timefun(func):

print("%s called at %s"%(func.__name__, ctime()))

ret = func()

return ret

@timefun

def foo():

print("i am foo")

@timefun 

def getinfo():

return '----hahah---'

帶有引數的裝飾器

from time import ctime, sleep

def timefun_arg(pre="hello"):

def timefun(func):

print("%s called at %s %s"%(func.__name__, ctime(), pre))

return func()

return timefun

@timefun_arg(「sxt")

def foo():

print("i am foo")

@timefun_arg("python")

def too():

print("i am too" )

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...