Python装饰器的应用场景有哪些
admin
2023-01-29 04:00:05
0

理解:

Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程。装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

应用场景:

1、授权(Authorization)

装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量使用于Flask和Django web框架中。这里是一个例子来使用基于装饰器的授权:

from functools import wraps    # 最新版python引用是 import functools

def requires_auth(f):    #  f 就是我们需要装饰的函数,一看就是不带参数的装饰器
    @wraps(f)     # 新版python写法 @functools.wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            authenticate()
        return f(*args, **kwargs)
    return decorated    # 该装饰器需相关配置才能运行,这里是截取代码展示应用

2.、日志(Logging)

日志是装饰器运用的另一个亮点。这是个例子:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from functools import wraps

def logit(func):
    @wraps(func)
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging

@logit
def addition_func(x):
   """Do some math."""
   return x + x
result = addition_func(4)

我敢肯定你已经在思考装饰器的一个其他聪明用法了。

3.、带参数的装饰器

带参数的装饰器是典型的闭包函数

4.、在函数中嵌入装饰器

我们回到日志的例子,并创建一个包裹函数,能让我们指定一个用于输出的日志文件

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from functools import wraps

def logit(logfile='out.log'):
    def logging_decorator(func):
        @wraps(func)
        def wrapped_function(*args, **kwargs):
            log_string = func.__name__ + " was called"
            print(log_string)
            # 打开logfile,并写入内容
            with open(logfile, 'a') as opened_file:
                # 现在将日志打到指定的logfile
                opened_file.write(log_string + '\n')
            return func(*args, **kwargs)
        return wrapped_function
    return logging_decorator
@logit()
def myfunc1():
    pass

myfunc1()
# Output: myfunc1 was called
# 现在一个叫做 out.log 的文件出现了,里面的内容就是上面的字符串

@logit(logfile='func2.log')
def myfunc2():
    pass

myfunc2()
# Output: myfunc2 was called
# 现在一个叫做 func2.log 的文件出现了,里面的内容就是上面的字符串

5.、装饰器类

现在我们有了能用于正式环境的logit装饰器,但当我们的应用的某些部分还比较脆弱时,异常也许是需要更紧急关注的事情。比方说有时你只想打日志到一个文件。而有时你想把引起你注意的问题发送到一个email,同时也保留日志,留个记录。这是一个使用继承的场景,但目前为止我们只看到过用来构建装饰器的函数。

幸运的是,类也可以用来构建装饰器。那我们现在以一个类而不是一个函数的方式,来重新构建logit。

上一篇:Python基础(一)

下一篇:python常用小技巧

相关内容

热门资讯

特朗普第三度通谍伊朗,红线划到... 前一天刚刚宣称“赢麻了”的美国总统特朗普,22日突然通过社交媒体向伊朗强硬喊话。“即刻起,只要伊朗伊...
2男子涉嫌盗窃转运数百只猫,警... 山东莱州市公安局7月23日通报,7月22日5时许,该局接群众报警称有人盗猫。接警后,公安民警迅速到达...
东方空间引力一号一箭9星发射成... 上证报中国证券网讯(记者 于祥明)记者7月22日从东方空间商业航天公司获悉,东方空间引力一号(遥四)...
湖北交投:用“积木”搭出长寿桥... 7月20日,汉宜高速改扩建项目施工现场一片繁忙,一块预制UHPC盖梁模壳借助吊机平稳落位,短短半小时...
李尔平院士:为智能时代筑牢“电... 封面新闻记者 刘叶 车家竹 摄影 何宏杰 在人工智能浪潮席卷全球的今天,一个名为“电磁兼容”的专业领...
江苏、上海等地将机器人纳入“国... 南都讯记者杨文君 发自北京 7月22日,记者从商务部获悉,2026年上半年,消费品以旧换新累计带动相...
“引力一号”成功发射一箭九星,... IT之家 7 月 22 日消息,今天上午,引力一号运载火箭在上海东部海域点火升空,成功将 9 颗卫星...
特朗普向4名士兵灵柩敬礼,均阵... 当地时间7月22日,美国总统唐纳德·特朗普率领数位高官,来到位于特拉华州的多佛空军基地,参加了阵亡美...
“特朗普这么干,10年后,美国... 据南华早报7月23日报道,分析人士认为,北京如今在语言能力方面更善于解读美国战略,而美国却难以做到同...
墨西哥一市长在市政厅内遭枪击死... 综合法新社等多家外媒报道,墨西哥检方当地时间22日通报称,该国中部一地方市长在市政厅内遭枪击死亡。今...