测试1
deco运行,但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')
测试8
class作为修饰器
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 = 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装饰器实例大详解的使用技巧和注意事项,需要的朋友参考一下 一.作用域 在python中,作用域分为两种:全局作用域和局部作用域。 全局作用域是定义在文件级别的变量,函数名。而局部作用域,则是定义函数内部。 关于作用域,我们要理解两点: a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修
问题内容: 考虑这个小例子: 哪个打印 为什么参数(应该是Test obj实例)没有作为第一个参数传递给装饰函数? 如果我手动进行操作,例如: 它按预期工作。但是,如果我必须事先知道某个函数是否装饰,它就破坏了装饰器的全部目的。这里的模式是什么,还是我误会了什么? 问题答案: tl; dr 您可以通过将类作为描述符并返回部分应用的函数来解决此问题,该函数从中应用对象作为参数之一,如下所示 实际问题
本文向大家介绍Python闭包与装饰器原理及实例解析,包括了Python闭包与装饰器原理及实例解析的使用技巧和注意事项,需要的朋友参考一下 一、闭包 闭包相当于函数中,嵌套另一个函数,并返回。代码如下: 二、装饰器 装饰器:把函数test当成变量传入装饰函数deco --> 执行了装饰操作后,变量传回给了函数test()。比如装饰器效果是test = test-1,test函数经过deco装饰后,
本文向大家介绍Python闭包和装饰器用法实例详解,包括了Python闭包和装饰器用法实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python闭包和装饰器用法。分享给大家供大家参考,具体如下: Python的装饰器的英文名叫Decorator,作用是完成对一些模块的修饰。所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装
本文向大家介绍Python使用装饰器模拟用户登陆验证功能示例,包括了Python使用装饰器模拟用户登陆验证功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python使用装饰器模拟用户登陆验证功能。分享给大家供大家参考,具体如下: 运行结果: 更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python编码操作技巧总结》、《Python
本文向大家介绍基于Python 装饰器装饰类中的方法实例,包括了基于Python 装饰器装饰类中的方法实例的使用技巧和注意事项,需要的朋友参考一下 title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] category: ['Python'] --- 目前在中文网