Python装饰器使用示例 及 实际应用例子 与应用
2018-02-27 13:37
513 查看
这篇文章主要介绍了Python装饰器使用示例及实际应用例子,本文给出了斐波拉契数列、注册回调函数、mysql封装、线程异步等实际使用示例,需要的朋友可以参考下
测试1deco运行,但myfunc并没有运行复制代码代码如下:
def deco(func):
print 'before func'
return funcdef myfunc():
print 'myfunc() called'
myfunc = deco(myfunc)
测试2需要的deco中调用myfunc,这样才可以执行
复制代码代码如下:
def deco(func):
print 'before func'
func()
print 'after func'
return funcdef myfunc():
print 'myfunc() called'
myfunc = deco(myfunc)
测试3@函数名 但是它执行了两次复制代码代码如下:
def deco(func):
print 'before func'
func()
print 'after func'
return func@deco
def myfunc():
print 'myfunc() called'myfunc()
测试4这样装饰才行复制代码代码如下:
def deco(func):
def _deco():
print 'before func'
func()
print 'after func'
return _deco@deco
def myfunc():
print 'myfunc() called'
myfunc()
测试5@带参数,使用嵌套的方法
复制代码代码如下:
def deco(arg):
def _deco(func):
print arg
def __deco():
print 'before func'
func()
print 'after func'
return __deco
return _deco@deco('deco')
def myfunc():
print 'myfunc() called'
myfunc()
测试6函数参数传递
复制代码代码如下:
def deco(arg):
def _deco(func):
print arg
def __deco(str):
print 'before func'
func(str)
print 'after func'
return __deco
return _deco@deco('deco')
def myfunc(str):
print 'myfunc() called ', str
myfunc('hello')
测试7未知参数个数
复制代码代码如下:
def deco(arg):
def _deco(func):
print arg
def __deco(*args, **kwargs):
print 'before func'
func(*args, **kwargs)
print 'after func'
return __deco
return _deco@deco('deco1')
def myfunc1(str):
print 'myfunc1() called ', str@deco('deco2')
def myfunc2(str1,str2):
print 'myfunc2() called ', str1, str2
myfunc1('hello')
myfunc2('hello', 'world')
测试8class作为修饰器
复制代码代码如下:
class myDecorator(object):
def __init__(self, fn):
print "inside myDecorator.__init__()"
self.fn = fn
def __call__(self):
self.fn()
print "inside myDecorator.__call__()"
@myDecorator
def aFunction():
print "inside aFunction()"
print "Finished decorating aFunction()"
aFunction()
测试9
复制代码代码如下:
class myDecorator(object):
def __init__(self, str):
print "inside myDecorator.__init__()"
self.str = str
print self.str
def __call__(self, fn):
def wrapped(*args, **kwargs):
fn()
print "inside myDecorator.__call__()"
return wrapped
@myDecorator('this is str')
def aFunction():
print "inside aFunction()"
print "Finished decorating aFunction()"
aFunction()
实例给函数做缓存 --- 斐波拉契数列复制代码代码如下:
from functools import wraps
def memo(fn):
cache = {}
miss = object()
@wraps(fn)
def wrapper(*args):
result = cache.get(args, miss)
if result is miss:
result =
c8b7
fn(*args)
cache[args] = result
return result
return wrapper
@memo
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)print fib(10)
注册回调函数 --- web请求回调复制代码代码如下:
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')
mysql封装 -- 很好用
复制代码代码如下:
import umysql
from functools import wraps
class Configuraion:
def __init__(self, env):
if env == "Prod":
self.host = "coolshell.cn"
self.port = 3306
self.db = "coolshell"
self.user = "coolshell"
self.passwd = "fuckgfw"
elif env == "Test":
self.host = 'localhost'
self.port = 3300
self.user = 'coolshell'
self.db = 'coolshell'
self.passwd = 'fuckgfw'
def mysql(sql):
_conf = Configuraion(env="Prod")
def on_sql_error(err):
print err
sys.exit(-1)
def handle_sql_result(rs):
if rs.rows > 0:
fieldnames = [f[0] for f in rs.fields]
return [dict(zip(fieldnames, r)) for r in rs.rows]
else:
return []
def decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
mysqlconn = umysql.Connection()
mysqlconn.settimeout(5)
mysqlconn.connect(_conf.host, _conf.port, _conf.user, \
_conf.passwd, _conf.db, True, 'utf8')
try:
rs = mysqlconn.query(sql, {})
except umysql.Error as e:
on_sql_error(e)
data = handle_sql_result(rs)
kwargs["data"] = data
result = fn(*args, **kwargs)
mysqlconn.close()
return result
return wrapper
return decorator
@mysql(sql = "select * from coolshell" )
def get_coolshell(data):
... ...
... ..
线程异步
复制代码代码如下:
from threading import Thread
from functools import wraps
def async(func):
@wraps(func)
def async_func(*args, **kwargs):
func_hl = Thread(target = func, args = args, kwargs = kwargs)
func_hl.start()
return func_hl
return async_func
if __name__ == '__main__':
from time import sleep
@async
def print_somedata():
print 'starting print_somedata'
sleep(2)
print 'print_somedata: 2 sec passed'
sleep(2)
print 'print_somedata: 2 sec passed'
sleep(2)
print 'finished print_somedata'
def main():
print_somedata()
print 'back in main'
print_somedata()
print 'back in main'
main()
测试1deco运行,但myfunc并没有运行复制代码代码如下:
def deco(func):
print 'before func'
return funcdef myfunc():
print 'myfunc() called'
myfunc = deco(myfunc)
测试2需要的deco中调用myfunc,这样才可以执行
复制代码代码如下:
def deco(func):
print 'before func'
func()
print 'after func'
return funcdef myfunc():
print 'myfunc() called'
myfunc = deco(myfunc)
测试3@函数名 但是它执行了两次复制代码代码如下:
def deco(func):
print 'before func'
func()
print 'after func'
return func@deco
def myfunc():
print 'myfunc() called'myfunc()
测试4这样装饰才行复制代码代码如下:
def deco(func):
def _deco():
print 'before func'
func()
print 'after func'
return _deco@deco
def myfunc():
print 'myfunc() called'
myfunc()
测试5@带参数,使用嵌套的方法
复制代码代码如下:
def deco(arg):
def _deco(func):
print arg
def __deco():
print 'before func'
func()
print 'after func'
return __deco
return _deco@deco('deco')
def myfunc():
print 'myfunc() called'
myfunc()
测试6函数参数传递
复制代码代码如下:
def deco(arg):
def _deco(func):
print arg
def __deco(str):
print 'before func'
func(str)
print 'after func'
return __deco
return _deco@deco('deco')
def myfunc(str):
print 'myfunc() called ', str
myfunc('hello')
测试7未知参数个数
复制代码代码如下:
def deco(arg):
def _deco(func):
print arg
def __deco(*args, **kwargs):
print 'before func'
func(*args, **kwargs)
print 'after func'
return __deco
return _deco@deco('deco1')
def myfunc1(str):
print 'myfunc1() called ', str@deco('deco2')
def myfunc2(str1,str2):
print 'myfunc2() called ', str1, str2
myfunc1('hello')
myfunc2('hello', 'world')
测试8class作为修饰器
复制代码代码如下:
class myDecorator(object):
def __init__(self, fn):
print "inside myDecorator.__init__()"
self.fn = fn
def __call__(self):
self.fn()
print "inside myDecorator.__call__()"
@myDecorator
def aFunction():
print "inside aFunction()"
print "Finished decorating aFunction()"
aFunction()
测试9
复制代码代码如下:
class myDecorator(object):
def __init__(self, str):
print "inside myDecorator.__init__()"
self.str = str
print self.str
def __call__(self, fn):
def wrapped(*args, **kwargs):
fn()
print "inside myDecorator.__call__()"
return wrapped
@myDecorator('this is str')
def aFunction():
print "inside aFunction()"
print "Finished decorating aFunction()"
aFunction()
实例给函数做缓存 --- 斐波拉契数列复制代码代码如下:
from functools import wraps
def memo(fn):
cache = {}
miss = object()
@wraps(fn)
def wrapper(*args):
result = cache.get(args, miss)
if result is miss:
result =
c8b7
fn(*args)
cache[args] = result
return result
return wrapper
@memo
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)print fib(10)
注册回调函数 --- web请求回调复制代码代码如下:
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')
mysql封装 -- 很好用
复制代码代码如下:
import umysql
from functools import wraps
class Configuraion:
def __init__(self, env):
if env == "Prod":
self.host = "coolshell.cn"
self.port = 3306
self.db = "coolshell"
self.user = "coolshell"
self.passwd = "fuckgfw"
elif env == "Test":
self.host = 'localhost'
self.port = 3300
self.user = 'coolshell'
self.db = 'coolshell'
self.passwd = 'fuckgfw'
def mysql(sql):
_conf = Configuraion(env="Prod")
def on_sql_error(err):
print err
sys.exit(-1)
def handle_sql_result(rs):
if rs.rows > 0:
fieldnames = [f[0] for f in rs.fields]
return [dict(zip(fieldnames, r)) for r in rs.rows]
else:
return []
def decorator(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
mysqlconn = umysql.Connection()
mysqlconn.settimeout(5)
mysqlconn.connect(_conf.host, _conf.port, _conf.user, \
_conf.passwd, _conf.db, True, 'utf8')
try:
rs = mysqlconn.query(sql, {})
except umysql.Error as e:
on_sql_error(e)
data = handle_sql_result(rs)
kwargs["data"] = data
result = fn(*args, **kwargs)
mysqlconn.close()
return result
return wrapper
return decorator
@mysql(sql = "select * from coolshell" )
def get_coolshell(data):
... ...
... ..
线程异步
复制代码代码如下:
from threading import Thread
from functools import wraps
def async(func):
@wraps(func)
def async_func(*args, **kwargs):
func_hl = Thread(target = func, args = args, kwargs = kwargs)
func_hl.start()
return func_hl
return async_func
if __name__ == '__main__':
from time import sleep
@async
def print_somedata():
print 'starting print_somedata'
sleep(2)
print 'print_somedata: 2 sec passed'
sleep(2)
print 'print_somedata: 2 sec passed'
sleep(2)
print 'finished print_somedata'
def main():
print_somedata()
print 'back in main'
print_somedata()
print 'back in main'
main()
相关文章推荐
- Python装饰器使用示例及实际应用例子
- Python装饰器使用示例及实际应用例子
- ajax 小例子 示例 简单应用 如何使用
- 在看官方的例子时候由一个grid实例,在每一行之前有个加号,展开可以显示内容,在实际应用中还是非常有用的,照搬例子的代码,发现老是提示对象不存在,查阅资料后发现是没有加载插件,这里和大家分享下Ext.grid.RowExpander插件的使用,
- 使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析
- JavaScript实际应用:innerHTMl和确认提示的使用
- Lex和Yacc使用方法(七).企业方面的实际应用
- SQL SERVER 2005 分区表实际应用例子
- JavaScript实际应用:innerHTMl和确认提示的使用
- JavaScript实际应用:innerHTMl和确认提示的使用
- Flex的应用中如何使用特殊字符的例子
- 使用企业库DAAB开发企业级应用的示例[下载]
- 【开源】QuickPager ASP.NET2.0分页控件——使用示例、基本应用和查询功能
- JavaScript实际应用:innerHTMl和确认提示的使用
- Asp.Net 3.5 应用Linq的例子1(C#)以及Web.Config示例
- RUP概述与实际应用的例子
- 使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数--在实际中的应用
- JavaScript实际应用:innerHTMl和确认提示的使用
- 使用JSF, Spring, Hibernate构建一个实际的web应用(转载)
- JavaScript实际应用:innerHTMl和确认提示的使用