python装饰器应用论文_python 装饰器应用
1?注冊回調函數
下面這個示例展示了通過URL的路由來調用相關注冊的函數示例:
class?MyApp():
def?__init__(self):
self.func_map?=?{}
def?register(self,?name):
def?func_wrapper(func):
self.func_map[name]?=?func
return?func
return?func_wrapper
def?call_method(self,?name=None):
func?=?self.func_map.get(name,?None)
if?func?is?None:
raise?Exception("No?function?registered?against?-?"?+?str(name))
return?func()
app?=?MyApp()
@app.register('/')
def?main_page_func():
return?"This?is?the?main?page."
@app.register('/next_page')
def?next_page_func():
return?"This?is?the?next?page."
print?app.call_method('/')
print?app.call_method('/next_page')
注意:
1)上面這個示例中,用類的實例來做decorator。
2)decorator類中沒有__call__(),但是wrapper返回了原函數。所以,原函數沒有發生任何變化。
2 打印日志
from functools import wraps
import inspect
def get_line_number():
return inspect.currentframe().f_back.f_back.f_lineno
def logger(loglevel):
def log_decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
ts = time.time()
result = fn(*args, **kwargs)
te = time.time()
print "function?? = " + fn.__name__,
print "??? arguments = {0} {1}".format(args, kwargs)
#print "??? return??? = {0}".format(result)
print "??? time????? = %.6f sec" % (te-ts)
if (loglevel == 'debug'):
print "??? called_from_line : " + str(get_line_number())
return result
return wrapper
return log_decoratorspam(1,2,3)
3 調用追蹤
import sys,os,linecache
def trace(f):
def globaltrace(frame, why, arg):
if why == "call": return localtrace
return None
def localtrace(frame=1, why=2, arg=4):
if why == "line":
# record the file name and line number of every trace
filename = frame.f_code.co_filename
lineno = frame.f_lineno
bname = os.path.basename(filename)
print "{}({}): {}".format(? bname,
lineno,
linecache.getline(filename, lineno)),
return localtrace
def _f(*args, **kwds):
sys.settrace(globaltrace)
result = f(*args, **kwds)
sys.settrace(None)
return result
return _f
@trace
def xxx():
a=1
print a
xxx() #調用
4 單例模式
#?coding=utf-8
#?測試utf-8編碼
#?單例裝飾器
import?sys
reload(sys)
sys.setdefaultencoding('utf-8')
#?使用裝飾器實現簡單的單例模式
def?singleton(cls):
instances?=?dict()??#?初始為空
def?_singleton(*args,?**kwargs):
if?cls?not?in?instances:??#如果不存在,?則創建并放入字典
instances[cls]?=?cls(*args,?**kwargs)
return?instances[cls]
return?_singleton
@singleton
class?Test(object):
pass
if?__name__?==?'__main__':
t1?=?Test()
t2?=?Test()
#?兩者具有相同的地址
print?t1
print?t2
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python装饰器应用论文_python 装饰器应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python抓取页面数据实例
- 下一篇: 2015新东方计算机,2015年同等学力