在學習cs20si中遇到了裝飾器,所以這裡介紹下裝飾器decorator的使用。
主要內容依據
python中,所有的東西都是物件,乙個函式可以被賦到變數中,傳遞給另乙個函式,或者被其他函式作為返回值。
python的裝飾器就是乙個函式,接受函式作為引數,並且用另乙個函式作返回值。
import time
deftimetest
(input_func):
deftimed
(*args, **kwargs):
""" caculate time"""
start_time = time.time()
result = input_func(*args, **kwargs)
end_time = time.time()
print
"method name - , args - , kwargs - , excution time - ".format(
input_func.__name__,
args,
kwargs,
end_time - start_time
)return result
return timed
@timetest
deffoorbar
(*args, **kwargs):
time.sleep(0.3)
print
"inside foorbar"
print args, kwargs
foorbar(["hello world"], foo=2, bar=5)
將函式foorbar傳遞給了裝飾器timetest,作為引數input_func
method裝飾器可以將類的method作為類的屬性
def
method_decorator
(method):
definner
(city_instance):
if city_instance.name == "sfo":
print
"its a cool place to live in."
else:
method(city_instance)
return inner
class
city
():def
__init__
(self, name):
self.name = name
@method_decorator
defprint_test
(self):
print self.name
p1 = city("sfo")
p1.print_test()
輸出
its a cool place to live in.
p1 = city("sf")
p1.print_test()
輸出
sf如何想要返回值為函式時,可以採用function 裝飾器,但如果希望裝飾器的返回值為乙個物件時,需要用乙個class decorator。
class
decoclass
():def
__init__
(self, f):
self.f = f
def__call__
(self):
# before f actions
print
'decorator initialised'
self.f()
print
"decorator terminated"
# after f actions
@decoclass
defkclass
():print
"class"
kclass()
輸出
decorator initialisedclass
decorator terminated
python中裝飾器的使用
使用閉做包裝飾器 def filter func def test username,password if username admin and password 123456 func username,password else print 登入失敗 return test filter de...
Python中裝飾器的使用
說明 掌握python中裝飾器的使用 1.裝飾器解決什麼問題?不改變函式的結構,為函式新增功能就是我們的裝飾器 在需要新增功能的函式上面加上乙個 裝飾器即可完成對函式的功能新增。如 decorator deftest pass2.裝飾器的定義與裝飾器的本質?2.1 裝飾器的定義 deflog f d...
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...