文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python装饰器有什么功能

2023-06-20 14:59

关注

这篇文章主要介绍“Python装饰器有什么功能”,在日常操作中,相信很多人在Python装饰器有什么功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python装饰器有什么功能”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

 一、函数回顾

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

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

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

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

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

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

函数是可以嵌套的。

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装饰器有什么功能”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯