Python裝飾器知識點補充

2022-10-06 04:54:06 字數 2050 閱讀 3315

首先回顧一下關於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...