裝飾器個人筆記 python

2021-10-13 05:32:15 字數 2461 閱讀 4676

為遵循**封閉的原則(即我們定義好的**不可被修改)但是要可以擴充套件所以我們會用到裝飾器

裝飾器的引數一定是乙個方法

裝飾器的返回也是乙個方法

import time

defcall_time

(func)

:#裝飾器的引數一定是個方法

""" :param func: 引數方法

:return: 返回的也是乙個方法

"""print

("我是外部函式,我現在正在被呼叫"

)print

("func={}"

.format

(func)

)def

inner()

: start = time.time(

) func(

) end = time.time(

)print

("**耗時{}"

.format

(end-start)

)return inner

@call_time 第一件事情呼叫call_time 第二件事情吧demo作為引數傳給call_time

defdemo()

: x=

0for i in

range(1

,100000001):

x+=i

print

(x)demo(

)

# 使用@語法糖實現裝飾器

defplay()

:print

("電腦"

)def

(func)

:#把要裝飾的函式作為形參

definner()

: func(

)#原來函式的呼叫

print

("玩遊戲"

)#增強功能的地方

print

("玩結他"

)return inner #返回內部函式的函式名

# 系統函式@ 加上外部函式名 優雅

defhello()

:print

("hello"

)#hello 就是inner

hello(

)

@wraper1   text = wraper1(

(wraper2(text)

)@wraper2 (text = wraper2(text)

)

def

(func)

:def

inner

(*args,

**kwargs)

:#用任意位置引數或者任意關鍵字引數

func(

*args,

**kwargs)

print

("==="*30

)return inner

defadd

(a,b)

:print

(a-b)

add(b=

3,a=

5)

只有在內部函式使用了外部函式的屬性和方法時候,內部函式才能返回外部函式的屬性

def

outter()

: a =

10# 1外部函式定義了變數

definner()

:print

(a)#2內部函式使用a的變數

return a

return inner #3外部函式返回內部函式的函式名

pf = outter(

)#返回了內部函式的函式名

pf()

def

can_play

(colok)

:print

("最外部函式被呼叫:clock{}"

.format

(colok)

)def

handle_action

(func)

:print

("handle_action函式被呼叫"

)def

do_action

(name,game)

:#真正的執行方法

if colok>=21:

print

("太晚了不能玩"

)else

:print

(func(name,game)

)return do_action

return handle_action

@can_play(18)

defplay_game

(name, game)

:return f"正在玩,大吉大利"

play_game(

"天翼"

,"和平精英"

)

Python 裝飾器筆記

def wrap in tag b fn wrap in tag b 是真正的裝飾器 def return fn return defwrap in tag i fn def return fn return wrap in tag b wrap in tag i defhello return h...

python 裝飾器筆記

python的裝飾器是乙個函式b 用來裝飾另乙個函式a 使a具有b的功能,執行a方法同時 也會執行b方法 這種用法用到 內部函式 函式傳遞 沒有使用 def debug func print 1111 內部函式返回 入參函式 並執行 return func print 2222 裝飾器函式返回 內部...

Python 裝飾器筆記

def wrap in tag b fn wrap in tag b 是真正的裝飾器 def return fn return defwrap in tag i fn def return fn return wrap in tag b wrap in tag i defhello return h...