裝飾器概念及運用

2021-10-02 03:37:56 字數 2775 閱讀 5433

裝飾器概念及運用

#!/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中只要呼叫乙個函式,函式中自己呼叫自己,每次呼叫都會放到記憶體中反覆遞迴,但是當原函式沒結束時 就是說沒有設定遞迴結束標示 遞迴就不會結束,直到記憶體被用完,棧...