1. 程式人生 > >python函數裝飾器的使用

python函數裝飾器的使用

return == oba 閉包 影響 lob wrap 一次 global

# -*- coding: utf-8 -*-
‘‘‘
使用語法糖@來裝飾函數,相當於“myfunc = deco(myfunc)” 
但發現deco函數只在第一次被調用,且myfunc函數在第一次後又被多調用了一次
‘‘‘
def deco(func):  
    print("before myfunc() called.") 
    
    func()
    print("after myfunc() called.")
    
    return func
bool=0
@deco
def myfunc(): 
	global bool
	bool=bool+1
	if not bool==2:
		print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
		bool=1

myfunc()
myfunc()


#用緩存避免重復運算
from functools import wraps 
def memo(f): 
	cache = {} 
	@wraps(f) #f函數不會被下面的閉包函數所影響
	def  wrap(arg): 
		if arg not in cache: cache[arg] = f(arg) 
		return cache 
	return wrap

@memo 
def fib(i):  
   return i*2

print fib(3)
print fib(5)
print fib(3)

  

python函數裝飾器的使用