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
@oneDecration
def sayHello(name1, name2, name3):
print(‘{}: hello, {}, {}’.format(name1,name2,name3))
@oneDecration
def sayHello1():
print(‘hello’)
sayHello1()
sayHello(‘Tom’,‘Jerry’, ‘Jim’)
装饰器一般格式
import functools
def 装饰器名(fun):
@functools.wraps(fun)
def wrapper(*args,
**kwargs):
dosomething
fun(*args, **kwargs)
return wrapper