裝飾器概念及運用
#!/user/bin/env python3
#-*-encoding="utf-8"-*-
1.裝飾器概念
裝飾器本身就是函式,為別的函式新增附加功能。把握兩個遵循的條件。
1.不修改被修飾的源**內容。
2.不修改被修飾函式的呼叫方式。
裝飾器=高階函式+函式巢狀+閉包
高階函式定義:
1.函式接收的引數是乙個函式名
2.函式的返回值是乙個函式名
3.滿足上述條件任意乙個,都可稱之為高階函式
把函式當做引數傳給高階函式:
def
foo():
print
("我的函式名是做為乙個高階函式傳給其它的函式的"
)def
fc1(fucn)
:print
("我是函式fc1,接受函式%s傳過來的值"
%fucn)
fucn(
)def
fc2(fucn)
:print
("我是函式fc2,函式返回值是%s"
%fucn)
return fucn
fc1(foo)
fc2(foo)
import time
deffoo()
:time.sleep(
0.2)
print
("引數來自foo"
)def
fc1(fucn)
: ks_time=time.time(
)fucn(
)js_time=time.time(
)print
("函式%s執行的時間是%s"
%(fucn,js_time-ks_time)
)fc1(foo)
import time
deffoo()
:print
('from the foo'
)def
timmer
(func)
: start_time=time.time(
)return func
stop_time=time.time(
)print
('函式%s 執行時間是%s'
%(func,stop_time-start_time)
)foo=timmer(foo)
foo(
)
#高階函式總結
1.函式接收的引數是乙個函式名
#作用:在不修改函式源**的前提下,為函式新增新功能,
#不足:會改變函式的呼叫方式
2.函式的返回值是乙個函式名
#作用:不修改函式的呼叫方式
#不足:不能新增新功能
#函式巢狀的例子:
def
father
(name)
:print
('from father %s'
%name)
defson()
:print
('from son'
)def
grandson()
:print
('from grandson'
)grandson(
)son(
)print
(father(
'xfz'
))
一層套一層的最裡面的函式形成的就是乙個閉包。
3.裝飾器的框架
import time
defzsq(func)
:def
gongnenghanshu()
: ks_time=time.time(
) func(
) js_time=time.time(
)print
("函式執行的時間是:%s"
%(js_time-ks_time)
)return gongnenghanshu
例子:@zsq
deffoo():
time.sleep(3)
print
("執行了函式foo"
) res=zsq(foo)
#這是間接方式實現的裝飾,但是更改了函式的呼叫方式.@語法甜糖,加到要呼叫裝飾器的前面
res(
) foo(
)
4.加返回值的方法 例2
import time
defzsq
(func)
:def
gongnenghanshu()
: ks_time=time.time(
) res=func(
) js_time=time.time(
)print
("函式執行的時間是:%s"
%(js_time-ks_time)
)return res
return gongnenghanshu
# 例子:
@zsq
deffoo()
: time.sleep(1)
print
("執行了函式foo"
)return
"我是要新增的函式返回值"
z=foo(
)print
(z)
裝飾器語法糖運用
def create people print 女媧真厲害,捏個泥吹口氣就成了人!def a func def b print 灑點水 func return b ret a create people ret 通過裝飾器語法等同於 def a func def b print 灑點水 func r...
運用staticmethod裝飾器的簡單方式
from math import sqrt class object def init self,a,b,c self.a a self.b b self.c c staticmethod defis valid a,b,c return a b c and b c a and a c b defp...
python 裝飾器,高階與運用
小 tips 寫遞迴函式的章節提到過,當函式不斷呼叫自身,直到被pycharm發現丟擲異常。實際上是因為棧溢位。什麼是棧溢位呢?python中只要呼叫乙個函式,函式中自己呼叫自己,每次呼叫都會放到記憶體中反覆遞迴,但是當原函式沒結束時 就是說沒有設定遞迴結束標示 遞迴就不會結束,直到記憶體被用完,棧...