python 閉包 注入 裝飾

2021-07-25 04:30:30 字數 1940 閱讀 2647

##-coding:utf-8-##

defhtml_tags

(tag_name):

print

print

'call html_tags(tag_name): ' + tag_name

def(func):

print

"\tcall warpper_(func): " + func.__name__ +" " + str(type(func))

​ def

(*args, **kwargs):

print

print

"\t\t\ttag_name: " + tag_name + ", callfunc: " + func.__name__

content = func(*args, **kwargs)

return

"<>".format(tag=tag_name, content=content)​​

# @html_tags('c') 相當於執行了hello = html_tag('c')(hello),注入進去,返回乙個匿名函式hello,

# print hello('word1')相當於執行 hello('word1')

@html_tags('c') #hello = html_tag('c')(hello)

defhello

(name='toby'):

return

'hello {}!'.format(name)

print hello('word1') #hello('word')

​res = html_tags('b')(hello) #由於有@html_tag裝飾,hello = html_tag('c')(hello)已經執行,res已經注入進去

print res('test1')

​res = html_tags('a')(res) #注入上乙個, 函式棧,如果不是res而hello,將注入c而不是b

print res('test2')

​print

"\n這是hello('word2')呼叫"

print hello('word2') #hello('word2')

​@html_tags('d')

defdemo

(name='test3'):

return

'hello {}!'.format(name)

print demo('word3')

​exit()

結果:/usr/bin/python demo.py

call html_tags(tag_name): c

call warpper_(func): hello 'function'>

tag_name: c, callfunc: hello

hello word1!

​call html_tags(tag_name): b

tag_name: c, callfunc: hellohello test1!

call html_tags(tag_name): a

tag_name: c, callfunc: hello

hello test2!

​這是hello('word2')呼叫

tag_name: c, callfunc: hello

hello word2!

​call html_tags(tag_name): d

call warpper_(func): demo 'function'>

tag_name: d, callfunc: demo

hello word3!

​process finished with

exit code 0

Python 裝飾器 ,閉包

1 裝飾器 不改變被裝飾的函式情況下附加一些功能 本質是函式,用於裝飾其他函式,附加一些本身所沒有的功能 實質 是乙個函式 引數 是你要裝飾的函式名 並非函式呼叫 返回 是裝飾完的函式名 也非函式呼叫 作用 為已經存在的物件新增額外的功能 特點 不需要對物件做任何的 上的變動 例1 計算執行時長 i...

python裝飾器和閉包

下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...

python閉包和裝飾器

要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...