装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
# 实例1userAge = input('enter your age: ')
userAge = int(userAge)# 不使用语法糖
def canYou(func):def decorator():if userAge > 1 and userAge < 10: # 年龄在1到10岁之间可以play,否则out of rangereturn func()print('out of range.\n')return decoratordef play():print('now play')play = canYou(play)play()# 使用语法糖
def canYou(func):def decorator():if userAge > 1 and userAge < 10: # 年龄在1到10岁之间可以play,否则out of rangereturn func()print('out of range.\n')return decorator@canYou
def play():print('now play')play()
修饰器最原始就是对原函数做了包装并返回了另外一个函数,额外添加了一些功能。因为这样写实在不太优雅,在后面版本的Python中支持了@语法糖。
#实例2def logger(func):def wrapper():print('Logging execution')func()print('Done logging')return wrapper@logger
def sample():print('Inside sample function')sample()
实例1,2是最简单的装饰器,但是有一个问题,如果被装饰的函数需要传入参数,那么这个装饰器就坏了。因为返回的函数并不能接受参数。但Python提供了可变参数*args和关键字参数**kwargs,有了这两个参数,装饰器就可以用于任意目标函数了。
userAge = input('enter your age: ')
userAge = int(userAge)def canYou(func):def decorator(*args, **kwargs):if userAge > 1 and userAge < 10: # 年龄在1到10岁之间可以play,否则out of rangereturn func(*args, **kwargs)print('out of range.\n')return decorator@canYou
def play():print('now play')play()
至此,初级的装饰器写法至此就结束了。