千家信息网

Python装饰器实例应用分析

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本文小编为大家详细介绍"Python装饰器实例应用分析",内容详细,步骤清晰,细节处理妥当,希望这篇"Python装饰器实例应用分析"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知
千家信息网最后更新 2026年11月04日Python装饰器实例应用分析

本文小编为大家详细介绍"Python装饰器实例应用分析",内容详细,步骤清晰,细节处理妥当,希望这篇"Python装饰器实例应用分析"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、函数回顾

1、在python中函数是一等公民,函数也是对象。我们可以把函数赋予变量。

def make_cofe(type):    print("获得一杯 : {}".format(type))get_cofe = make_cofeget_cofe("咖啡")####输出#####获得一杯 : 咖啡

这个例子中,我们把函数make_cofe 赋予了变量 get_cofe,这样之后你调用 get_cofe,就相当于是调用函数 make_cofe()。

2、把函数当作参数,传入另一个函数中。

def make_cofe(type):    print("获得一杯 : {}".format(type))def shop(func,type):    func(type)shop(make_cofe,"咖啡")####输出####获得一杯 : 咖啡

这个例子,我们把make_cofe以参数的形式传入shop中,然后调用它。

3、函数是可以嵌套的。

def shop(type):    def make_cofe(type):        print("获得一杯 : {}".format(type))    make_cofe(type)shop("咖啡")#####输出####获得一杯 : 咖啡

这段代码中,我们在函数shop内部定义了函数make_cofe 4、函数的返回值也可以是函数对象(闭包)。

def shop():    def make_cofe(type):        print("获得一杯 : {}".format(type))    return make_cofeget_cofe=shop()get_cofe("咖啡")####输出#####获得一杯 : 咖啡

这里,函数 shop() 的返回值是函数对象 make_cofe 本身,之后,我们将其赋予变量 get_cofe,再调用 get_cofe("咖啡")。

二、装饰器

下面我们正式开始装饰器的学习。 我们先想一个问题。如果我们去咖啡店要一杯咖啡,我们应该如何实现。你也许会这么写。

def cofe():    print("咖啡", end="")cofe()####输出####咖啡

那我们现在想来一杯加糖咖啡,我们该如何写呢?你也许会这么想,那还不简单,直接在cofe()函数里改不就好了。

def cofe():    print("加糖咖啡", end="")cofe()####输出####加糖咖啡

那么问题来了,如果我们现在不想喝加糖咖啡了,该怎么办呢,总不能在cofe()函数里去掉吧。那如果有人想喝加糖咖啡、有人不想喝加糖咖啡如何是好,总不能写两个cofe()函数吧。 那我们带着问题看一下下面这段代码。

def add_sugar(func):    def add():        print("加糖",end="")        func()    return adddef cofe():    print("咖啡",end="")cofe = add_sugar(cofe)print("获得一杯",end="")cofe()####输出#####获得一杯加糖咖啡

变量 cofe 指向了内部函数 add(),而内部函数 add() 中又会调用原函数 cofe(),因此,最后调用 cofe() 时,就会先打印'加糖",然后输出'咖啡"。这里的函数 add_sugar() 就是一个装饰器,它把真正需要执行的函数cofe()包裹在其中,并且改变了它的行为,但是原函数 cofe() 不变。 下面我们来看一下更优雅的写法。

def add_sugar(func):    def add():        print("加糖",end="")        func()    return add@add_sugardef cofe():    print("咖啡",end="")print("获得一杯",end="")cofe()#####输出#####获得一杯加糖咖啡

这里的@叫做语法糖, @add_sugar就相当于前面的cofe = add_sugar(cofe)语句,只不过更加简洁。因此程序中建议用这种写法。 好了,让我们来回顾下我们的问题,如果有人想喝加糖咖啡、有人不想喝加糖咖啡如何是好。学了装饰器那不就很简单了,如果要喝加糖咖啡,我们把加糖的装饰器@add_sugar给加上不就好了,如果喝不加糖的,那就不加装饰器,这样我们就把这个问题给完美解决掉了。在不改变函数内部的前提了,给函数又添加了新的功能。 到目前为止,我们已经把最简单的装饰器学完了。下面我们在考虑一个问题,如果原函数 cofe() 中,有参数需要传递给装饰器怎么办?一个简单的办法,是可以在对应的装饰器函数 add() 上,加上相应的参数。

def add_sugar(func):    def add(type):        print("加糖",end="")        func(type)    return add@add_sugardef cofe(type):    print("{}咖啡".format(type),end="")cofe("美式")print()cofe("拿铁")####输出#####加糖美式咖啡加糖拿铁咖啡

不过,新的问题来了。如果我另外还有一个函数(奶茶函数),也需要使用 add_sugar() 装饰器,但是这个新的函数有两个参数,又该怎么办呢? 通常情况下,我们会把*args和 **kwargs,作为装饰器内部函数 add() 的参数。*args和**kwargs,表示接受任意数量和类型的参数,因此加糖装饰器就可以写成下面的形式:

def add_sugar(func):    def add(*args, **kwargs):        print("加糖",end="")        func(*args, **kwargs)    return add     @add_sugardef cofe(type):    print("{}咖啡".format(type),end="")@add_sugardef milk_tea(type,num):    print("{}杯{}奶茶".format(num,type), end="")cofe("美式")print()milk_tea("xx牌子","4")####输出####加糖美式咖啡加糖4杯xx牌子奶茶

这样我们的咖啡和奶茶都可以加糖了。 前面我们讲的是函数的装饰器,下面我们来讲一下类作为装饰器。类装饰器主要依赖于函数__call__(),每当你调用一个类的实例时,函数__call__()就会被执行一次。

class Add_sugar:    def __init__(self, func):        self.func = func        self.add_suger = "加糖"    def __call__(self, *args, **kwargs):        print(self.add_suger,end="")        return self.func(*args, **kwargs)@Add_sugardef cofe():    print("咖啡")cofe()####输出#####加糖咖啡

最后如果我们的咖啡既要加糖又要加冰,那我们该如何做呢?我们定义一个加冰的装饰器就好了呀。

def add_sugar(func):    def add():        print("加糖",end="")        func()    return adddef add_ice(func):    def add():        print("加冰",end="")        func()    return add@add_sugar@add_icedef cofe():    print("咖啡",end="")cofe()####输出####加糖加冰咖啡

读到这里,这篇"Python装饰器实例应用分析"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

咖啡 函数 一杯 输出 参数 问题 实例 变量 奶茶 分析 应用 对象 怎么办 文章 两个 代码 例子 内容 写法 形式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网络科技 科技赋能下的互联网金融 期待互联网科技 互联网科技作文 奇酷互联网络科技公司 互联网 视角下的科技创新 卓越科技互联网 招聘 四个字互联网科技公司取名 科技赋能互联网健康 北京华百购互联网科技有限公司 互联网对科技的发展 互联网科技革命什么开始 互联网科技商业 杭州壁岐互联网科技有限公司 本届互联网博览会上的黑科技 西安小鹰速贷互联网科技有限公司 互联网营销推广黑科技 宁波跨境商互联网科技有限公司 科技互联网专业工作会议发言稿 前海云享互联网科技 河南云网互联网络科技有限公司 美国互联网科技巨头监管 礼当家互联网科技 天津摩尔互联网科技 受益于互联网科技的高速发展 互联网金融中的现代科技 厦门江牛科技互联网 互联网时代科技型公司的机会 万物互联网智能科技 互联网领先科技成果宣传视频
0