当前位置: 代码迷 >> 综合 >> 【Python】装饰器
  详细解决方案

【Python】装饰器

热度:95   发布时间:2024-01-31 23:25:28.0

装饰器本质上是一个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()

至此,初级的装饰器写法至此就结束了。

  相关解决方案