python之装饰器

装饰器是什么?

装饰器是一种在程序开发中经常使用到的功能,是在代码运行期间动态增加功能的方式。本质上,装饰器就是一个返回函数的高阶函数,当你学会装饰器后呢,python开发简直如虎添翼!!!

1、那么我们先来理解下函数对象与函数名称概念:在python中,函数时第一类对象,是指可以用标识符(函数名)来命令,且可以被当做数据处理的对象。当定义一个函数时,函数的本身是对象。
无论是把函数赋值给新的标识符,还是作为参数传递给新的函数,针对的都是函数对象本身,而不是函数的调用。

#定义函数fun_XT
def fun_XT():
    print('I am XT...')
#定义mfun(函数),参数为一个函数
def mfun(func):
    func()
#调用mfun,fun_XT函数的函数名作为参数传递
mfun(fun_XT)
#运行结果
I am XT...
#以上代码呢,可以理解为函数mfun调用fun_XT函数
#我们再来看下面一段代码
def fun_XT():#定义fun_XT函数
    def mfun():#定义内部函数mfun()
        print('I am XT...')
    return mfun
fun_xt()#我们这样调用函数呢,显示的结果返回值为mfun()函数
#也就是 <function fun_XT.<locals>.mfun at 0x00000250B1CA01F0>
#应该这样调用
fun_XT()()
#显示结果
I am XT...

在上述代码中,fun_XT内部定义的函数mfun作为一个变量返回,然后调用fun_XT函数获取返回值,最后继续调用返回的函数mfun打印出结果。
我们可以知道:函数本身可以看做一个对象,且函数对象可以被赋值给变量,所以通过变量也能调用该函数

2、装饰器的运用方式
首先要注意以下三点:

  1. 装饰器是一种增加函数功能的简单方法,它可以给不同的函数插入相同的功能。
  2. 装饰器的表示语法使用特殊符号“@”来实现。
  3. 装饰器的定义与普通函数的定义完全一致,但装饰器函数的参数必须有函数或对象。

先写一段代码感受下

#假设XT公司有三个部门,w部门,f1部门,f2部门。负责写代码程序,而f1和f2
#只负责调用。就好比你打游戏,你只需要玩,而装备技能由游戏内部程序生成。
#w部门为f1,f2设计程序如下
def f1():
    print('正在调用f1……')
def f2():
    print('正在调用f2……')
#f1部门调用函数时
f1()
#f2部门调用函数时
f2()
'''是不是有点简单?那么问题来了如果f2部门越权调用f1呢?怎么解决这个问题?
所以w部门根据需求来修改代码,为他们增加权限,那么来重构程序'''
#w部门重构后的程序
def w1(func):
    #定义inner函数,用于查询权限
    def inner():
         print('正在调查权限……')
         func()
    return inner
def f1():
    print('正在调用f1……')
def f2():
    print('正在调用f2……')
#当f1部门调用时
f1 = w1(f1)
f1()
#同理,f2部门的调用同样如此,别慌,装饰器马上来了,我们先来剖析下这段代码
'''简单说,当程序执行到f1 = w1(f1)时python到w1函数去执行,而形参func指
向f1,也就是函数f1()的地址传给了func,程序继续向下执行,return返回inner
函数。相当于f1 = inner 此时的f1指向inner地址.当执行f1()时,就等于执行了
inner()'''
#执行结果为
正在调查权限……
正在调用f1……

有点蒙?我这解释确实不生动,抱歉,文笔不行。别怕,我还有图片!!!有点简陋哈

在这里插入图片描述

了解了上面后,我们开始使用主角装饰器。也叫语法糖哦!

def w1(func):
    def inner():
        a = int(input('请输入验证码:'))
        print('---调查权限中---')
        if a == 1:
           print('验证成功!')
           func()
        else:
           print('验证失败!')
    return inner
#装饰器,等价于f1 = w1(f1)    
@w1          
def f1():
    print('正在调用f1……')
f1()
#运行结果
请输入验证码:1
---调查权限中---
验证成功!
正在调用f1……

ps:再添加一点,装饰器是一个从下往上装的过程,当调用时,代码已经装饰完了,开始从上往下调用!

def w1(func):
    print('装饰器执行时间')
    def inner():
        a = int(input('请输入验证码:'))
        print('---调查权限中---')
        if a == 1:
           print('验证成功!')
           func()
        else:
           print('验证失败!')
    return inner
#装饰器,等价于f1 = w1(f1)    
@w1#装饰器开始装饰,并不是调用f1后才装饰          
def f1():
    print('正在调用f1……')
#注意,这里我们没有调用函数,去执行下试试
#运行结果
装饰器执行时间
#通过这段代码我们知道,当解释器从上到下解释的时候,函数w1和f1并不会执行
#,而到@w1时,解释器会自动执行,也就是f1 = w1(f1),自动从下往上装饰。
#在调用f1之前,已经进行装饰了,而f1()只是执行装饰完后从上往下执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值