首先回顧一下關於python裝飾器以及程式設計客棧裝飾器模式
補全根據j**a實現裝飾器模式的,我們可以寫下面一段**:
import logging
def use_logging(func):
logging.warn("%s is running" % func.__name__)
return func
def foo():
print('i am foo')
foo = use_logging(foo)
foo() # 呼叫程式設計客棧
這個實現對於上篇文章中提到的j**a使用裝飾器。上面也是乙個裝飾器,實現最簡單的乙個增加函式日誌的功能,但是如果這個額外功能是要去檢測傳入的引數時,這時上面的就不行了。這時12步輕鬆搞定python裝飾器中的例子還是精妙的。
# 裝飾器
def wrapper(func):
def checker(a, b): # 1
if a.x < 0 or a.y < 0:
a = coordinate(a.x if a.x > 0 elsewww.cppcns.com 0, a.y if a.y > 0 else 0)
if b.x < 0 barxtgor b.y < 0:
b = coordinate(b.x if b.x > 0 else 0, b.y if b.y > 0 else 0)
ret = func(a, b)
if ret.x < 0 or ret.y < 0:
ret = coordinate(ret.x if ret.x > 0 else 0, ret.y if ret.y > 0 else 0)
return ret
return checker
# 原函式
def add(a, b):
return coordinate(a.x + b.x, a.y + b.y)
# 使用裝飾
add = wrapper(add)
細心你會發現,裝飾器函式的引數就是傳入的原函式,而內部函式的引數跟原函式一模一樣,最外層返回的是內部函式的引用,內部函式返回的是傳入引數的引用呼叫的結果
這裡用到了函式作為引數特性,當然還有些閉包的知識,具體請看 上面提到的部落格鏈結,真的講的不錯。
而上篇說到的python裝飾 特性就是這個神奇的語法糖了,可以這樣使用
# 原函式
@wrapper
def add(a, b):
return coordinate(a.x + b.x, a.y + b.y)
帶引數的裝飾器
如果要實現乙個帶引數的裝飾器,那要怎麼寫呢
def time_diff(s):
def decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print("[%s]執行程式所用時間: %s" % (s, end_time - start_time))
return res
return wrapper
return decorator
@time_diff("polynomial_1")
def polynomial_1(n, x):
res = 0
for i in range(n):
res += i*pow(x, i)
return res
呼叫並執行輸出結果:
print(polynomial_1(1, 5))
[duoxiangshi_1]執行程式所用時間: 4.76837158203125e-06
0帶引數的裝飾器需要在不帶引數裝飾器外再定義一層函式,最外層函式的返回值是第二層函式的引用程式設計客棧。
總結:多些多練,用於實際中,才能更加熟練。最近學資料結構與演算法,寫些裝飾器用來看程式執行時間,真是再方便不過了!
本文標題: python裝飾器知識點補充
本文位址:
python執行緒知識點補充
在多個執行緒共享資源的時候,如果兩個執行緒分別占有一部分資源,並且同時等待對方的資源,就會造成死鎖現象。如果鎖之間相互巢狀,就有可能出現死鎖。因此盡量不要出現鎖之間的巢狀。下方就是乙個死鎖型別,函式會卡在那不動,無法執行 import threading time def test1 num loc...
python知識點(八) 函式裝飾器
一 概述 1 用於管理和增強函式和類行為的 2 提供一種在函式或類定義中插入自動執行 的機制 3 特點 更明確的語法 更高的 可維護性 更好的一致性 二 1 使用函式定義裝飾器 def p decorator func def args,kwargs return f p decorator def...
正則知識點補充
1.與正規表示式有關的字串物件的方法 string.replace pattern,string 替換在正規表示式查詢中找到的文字。string.search pattern 通過正規表示式查詢相應的字串,只是判斷有無匹配的字串。如果查詢成功,search 返回匹配串的位置,否則返回 1。strin...