摘 人生苦短,每日python

2022-07-26 16:42:14 字數 3185 閱讀 2731

即使你沒聽過裝飾器,你也一定知道@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語法簡潔清晰,特...