您的位置:首页 > 其它

一个函数装饰器

2017-08-25 16:48 274 查看
Python的函数是对象
Python 函数可以被赋值def hello():–print(‘hello!’)
a = hello #注: 此处没有() ,是一个对象a() # 调用a() 结果与hello() 相同此时删除 hello,a() 依然保持原属性


函数可以定义在另一个函数里面

def say():
def hello():
return 'hello'
return hello
外层的say函数会把内层的 hello函数的执行结果输出



函数可以返回一个函数




可以将一个函数当作参数传递




书写一个装饰器

def oneDecorator(oneFunction):def oneWrapper():print ‘before’oneFunction()print ‘after’return oneWrapper

def sayHello(): print ‘hello’
run = oneDecorator(sayHello)run()
示例1





示例2




装饰器经典模式à累加装饰器






上例通过函数直接调用可写成

run = towDecorator(oneDecorator(sayHello))注:被装饰的函数不写括号,代表返回的是一个对象,然后通过对象()的方式运行run()

装饰器传递参数
只需要让包装函数传递参数即可

def oneDecoration(oneFunction): def wrapper(arg1, arg2): print(‘=’
* 50) oneFunction(arg1, arg2) print(‘=’
* 50) return wrapper
示例








使用装饰器装饰一个类中的方法

构建装饰器的时候,需要考虑self,所以在传参的时候,包装函数除了需要传递函数的参数,还要传递一个self参数
例:
def oneDecration(onefunction): def wrapper(self, args1, args2): print(‘=’* 50) oneFunction(self, args1, args2) print(‘=’ * 50) return wrapper
其它与上例无异,这里不再作演示

一个更为通用的装饰器

def oneDecration(onefunction): def wrapper(*args, **kwargs): print(‘=’ * 50) oneFunction(*args, **kwargs) print(‘=’ * 50) return wrapper@oneDecrationdef sayHello(name1, name2, name3): print(‘{}: hello, {}, {}’.format(name1,name2,name3))@oneDecrationdef sayHello1(): print(‘hello’)sayHello1()sayHello(‘Tom’,‘Jerry’, ‘Jim’)








装饰器一般格式

import functoolsdef 装饰器名(fun): @functools.wraps(fun) def wrapper(*args,
**kwargs):
dosomething fun(*args, **kwargs) return wrapper
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  装饰器