Py基础——装饰器的用法

本文介绍了Python装饰器的基础知识,包括如何装饰没有参数和有参数的函数,并探讨了如何为装饰器本身添加参数,通过实例展示了装饰器在不改变原函数定义的情况下改变其行为的能力。
摘要由CSDN通过智能技术生成

装饰器简单指导

众所周知

装饰器能够包装函数并返回包装好的函数
在不修改函数的定义时让函数的运行发生变化

一、装饰没有参数的函数

先看看这个小明认为的rtime装饰器
import time
def rtime(f):
    print (time.strftime('%H:%M:%S',time.localtime(time.time())))
    return f()

def pr():
    print('I am pr()')
pr = rtime(pr())

虽然他起到了修改函数运行结果的作用,but我认为这不是一个装饰器
因为它直接运行了rtime之后,pr就变成了None,对程序并没有帮助。
因此,我们需要闭包,在里面加上一个func.

import time
def rtime(f):
    def inner():
        print (time.strftime('%H:%M:%S',time.localtime(time.time())))
        return f()
    return inner

def pr():
    print('I am pr()')
pr = rtime(pr)
pr()

当然,还可以用@来装饰。

import time
def rtime(f):
    def inner():
        print (time.strftime('%H:%M:%S',time.localtime(time.time())))
        return f()
    return inner
@rtime
def pr():
    print('I am pr()')

pr()

注意!

返回rtime得到的函数要加上()因为这是为了运行它!

二、装饰有参数的函数

要是拿上面的rtime装饰器去装饰下方的mul函数,会发生什么?
import time
def rtime(f):
    def inner():
        print (time.strftime('%H:%M:%S',time.localtime(time.time())))
        return f()
    return inner
@rtime
def mul(x,y):
    return x*y

print(mul(1,1))

结果

Traceback (most recent call last):
  File "D:\1\asasasa.py", line 11, in <module>
    mul(1,2)
TypeError: inner() takes 0 positional arguments but 2 were given

异常信息指出:inner要0个参数,but他得到2个。
我们修改内部的函数。

import time
def rtime(f):
    def inner(x,y):
        print (time.strftime('%H:%M:%S',time.localtime(time.time())))
        return f(x,y)
    return inner
@rtime
def mul(x,y):
    return x*y

print(mul(1,2))

结果

12:51:34
2

可是还有3,4,5,6……个参数的函数咋办?
祭出args,kwargs!

import time
def rtime(f):
    def inner(*a,**b):
        print (time.strftime('%H:%M:%S',time.localtime(time.time())))
        return f(*a,**b)
    return inner
@rtime
def mul(a,b,c,d,e,f,g):

    return  a*b*c*d*e*f*g
print(mul(1,2,3,4,5,6,7))

这样就解决问题了。
可是,我们想要装饰器也有参数。

三、给装饰器加参数

我们三层函数就好了。 参考log()
def log(a):
    def inner(f):
        def Inner(*d,**b):
            print('[%s]CALLING %s'%(a,f.__name__))
            return f(*d,**b)
        return Inner
    return inner
@log('debug')
def f(a,b,c):
    return a+b+c
print(f(1,2,3))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值