registry = [] # 注冊(cè)處 #registry保存被@register裝飾的函數(shù)引用
def register(func): # 寄存器 #register的參數(shù)是一個(gè)函數(shù)
print('running register(%s)' % func) #為了演示,顯示被裝飾的函數(shù)
registry.append(func) #把func存入registry
return func #返回func:必須返回函數(shù);這里返回的函數(shù)與通過(guò)參數(shù)傳入的一樣0
@register #f1和f2被@register裝飾
def f1():
print('running f1()')
@register
def f2():
print('running f2()')
def f3(): #f3沒(méi)有裝飾
print('running f3()')
def main(): #main顯示registry,然后調(diào)用f1(),f2(),f3()
print('running main()')
print('registry ->', registry)
f1()
f2()
f3()
if __name__ == '__main__':
main() #只有把registration.py當(dāng)做腳本運(yùn)行得到的輸出如下
這里主要想強(qiáng)調(diào),函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,
而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。
這突出了Python程序員所說(shuō)的導(dǎo)入時(shí)和運(yùn)行時(shí)之間的區(qū)別
把registration.py當(dāng)做腳本運(yùn)行得到的輸出是
running register(<function f1 at 0x0000000002825A60>)
running register(<function f2 at 0x0000000002825AE8>)
running main()
registry -> [<function f1 at 0x0000000002825A60>, <function f2 at 0x0000000002825AE8>]
running f1()
running f2()
running f3()