最新學了裝飾器,有乙個疑問一直困擾我,思考了幾天,終於明白。
首先,展示正常的裝飾器(允許向乙個現有的物件新增新的功能,同時又不改變其結構,就是給函式穿個衣服,但是不改變函式)該如何寫?
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...