即使你沒聽過裝飾器,你也一定知道@staticmethod
作為函式的裝飾器,你可以這樣寫
def mydecorator(function):
# 在呼叫原始函式之前, 做點什麼
result = function(*args, **kwargs)
# 在函式呼叫之後, 做點什麼
# 並返回結果
return result
# 返回warpper作為裝飾函式
作為乙個例子,我寫了個非常隨意的
def print_hello(function):
def hello(*args, **kwargs):
print('hello start')
result = function(*args, **kwargs)
print('hello end')
return 'hello %s' % result
return hello
@print_hello
def print_world():
print('world print')
return 'world result'
if __name__ == '__main__':
print(print_world())
它的結果是
hello start
world print
hello end
hello world result
作為類的裝飾器,你可以這樣寫class decoratorasclass(object):
def __init__(self, function):
self.funciton = function
def __call__(self, *args, **kwargs):
# 在呼叫原始函式之前, 做點什麼
result = self.funciton(*args, **kwargs)
# 在呼叫函式之後, 做點什麼
# 並返回結果
return result
作為乙個例子,我依舊寫了乙個很隨意的
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
result = self.function(*args, **kwargs)
return result
class printworld (object):
def print_world(self):
print('world print')
return 'world result'
def print_kitty(self):
print('kitty print')
return 'kitty result'
if __name__ == '__main__':
print(printworld().print_world())
print('___')
print(printworld().print_kitty())
它的結果是
world print
world result
___kitty print
kitty result
當然,裝飾器也可以傳參
def repeat(number=3):
def actual_decorator(function):
result = none
for _ in range(number):
result = function(*args, **kwargs)
return result
return actual_decorator
@repeat(2)
def print_kitty():
print('kitty print')
return 'kitty result'
if __name__ == '__main__':
print(print_kitty())
它的結果是
kitty print
kitty print
kitty result
然後我想了想,為什麼不像函式裝飾器的模板那麼寫呢?
於是,我就隨意地寫了個錯誤的例子
def error_repeat(function, number=3):
result = none
for _ in range(number):
result = function(*args, **kwargs)
return result
@error_repeat
def print_world():
print('world print')
return 'world result'
它的結果是
world print
world print
world print
world result
很完美,但是當我想傳引數進去的時候,犯難了
呃,就姑且將這個錯誤的示例當做個笑話看看吧
儲存內省的裝飾器
from functools import wraps
def preserving_decorator(function):
@wraps(function)
# 包裝函式內部文件
return function(*args, **kwargs)
說實話,我沒看懂這段
所以摘錄下書中的原話
使用裝飾器的常見錯誤是在使用裝飾器時不儲存函式元資料(主要是文件字串和原始函式名)。摘自 《python高階程式設計》前面所有示例都存在這個問題。
裝飾器組合建立了乙個新函式,並返回乙個新物件,但卻完全沒有考慮原始函式的標識。這將使得除錯這樣裝飾過的函式更加困難,也會破壞可能用到的大多數自動生成文件的工具,因為無法訪問原始的文件字串和函式簽名。
python人生苦短 人生苦短,我用Python
python學習筆記 每日總結,反思.學習,1,注釋 單行注釋 注釋內容 多行注釋 注釋內容 快捷鍵 ctrl 2,變數 type 變數 用來檢視變數型別 變數型別,程式中需要特別注意變數型別,很容易報錯,或者很熟悉變數型別的報錯,錯了再改也成.格式轉化 紅線常用 bool布林型別 ture和fla...
人生苦短,Python 當歌!
每時每刻,搜尋引擎和 都在採集大量資料,非原創即採集。採集資訊用的程式一般被稱為網路蜘蛛 web spdier 網路爬蟲 web crawler 網路鏟 可模擬洛陽鏟 其行為一般是先 爬 到對應的網頁上,再把需要的資訊 鏟 下來。其實,網路資料採集程式就像乙隻辛勤採蜜的bee,它飛到花 目標網頁 上...
人生苦短,我用python
python是一種物件導向的解釋型計算機程式語言,由荷蘭人guido van rossum於1989年發明,第乙個公開發行版發行於1991年。python是純粹的自由軟體,源 和直譯器cpython遵循 gpl gnu general public license 協議 python語法簡潔清晰,特...