python中裝飾器詳解

2021-08-03 01:18:58 字數 1577 閱讀 1307

最新學了裝飾器,有乙個疑問一直困擾我,思考了幾天,終於明白。

首先,展示正常的裝飾器(允許向乙個現有的物件新增新的功能,同時又不改變其結構,就是給函式穿個衣服,但是不改變函式)該如何寫?

def log(func):  

print('call %s():' % func.__name__)

return func(*args, **kw)

依照模板可以如下實現:

def foo(func):

def inner():

print("1")

func()

print("2")

return func()

return inner

@foo

def func():

print("主函式")

func()

實現效果,在主函式的基礎上先後新增1和2

寫著寫著,突然我就有乙個疑問了,為什麼要巢狀乙個函式,也就是為什麼需要「inner」內建函式???

然後我就嘗試不用內建函式,哈,也能實現,咦!這是為什麼?

def foo(func):

print("1")

func()

print("2")

return func()

@foo

def func():

print("主函式")

如下是執行結果:-->是不是很奇怪,也是可以裝飾,就是會莫名多乙個主函式

揭曉答案

首先要知道裝飾器有什麼前提?

1.不修改被裝飾函式的源**(開放封閉原則)

2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式

3.裝飾器是在遵守1和2的前提下,為被裝飾的物件新增新功能

如果不使用內建函式,要求1和要求3都能滿足,唯獨要求2不滿足,不修改被修飾函式的呼叫方式,就是這個呼叫方式不滿足。

再次執行:

def foo(func):

print("1")

func()

print("2")

return func()

@foo

def func():

print("主函式")

func() -->這裡是重點,之前我沒有呼叫

檢視執行結果:

看看,報錯了吧。

總結,裝飾器還是需要內建函式的,裝飾器返回值為原函式名,這樣不會改變函式呼叫方式。

python中裝飾器

對修改是封閉的,對擴充套件是開放的 import time def f1 print time.time print this is a function.def f2 print this is a function.print time.time f1 def print current tim...

python中裝飾器理解

裝飾器 decorators 是 python 的乙個重要部分。簡單地說 他們是修改其他函式的功能的函式。他們有助於讓我們的 更簡短!由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 ...

Python中裝飾器的使用

在學習cs20si中遇到了裝飾器,所以這裡介紹下裝飾器decorator的使用。主要內容依據 python中,所有的東西都是物件,乙個函式可以被賦到變數中,傳遞給另乙個函式,或者被其他函式作為返回值。python的裝飾器就是乙個函式,接受函式作為引數,並且用另乙個函式作返回值。import time...