装饰器

本文深入探讨了Python中的闭包和装饰器概念,通过具体示例解释了闭包如何创建和使用,以及装饰器如何增强函数功能,包括计算执行时间、参数处理和装饰器加参数的应用。

闭包的一个例子:

def outer():
    x=10
    def inner():
        print(x)
    return inner       #inner被返回给了outer()
outer()()              #调用inner()
f=outer()              #f也指向inner()函数
f()                    #调用inner()函数
#inner()    #inner是局部变量,全局无法调用

装饰器的一个例子:原来有一个函数foo(),现在我们想在执行该函数的同时计算执行时间

import time
def foo():
    print('hello 1')
    time.sleep(2)

下面的函数就是一个装饰器:

def show_time(f):
    def inner():    #inner函数实现计算时间
        start = time.time()     #时间戳
        f()
        end=time.time()
        print('spend %s' %(end-start))
    return inner

调用装饰器的方法:在foo函数前面@装饰器函数,实现它与装饰器的连接

@show_time    #这一句等价于foo=show_time(foo),即让foo指向inner
def foo():
    print('hello 1')
    time.sleep(2)

foo()  #该语句等价于'show_time(foo)()':先执行show_time(其功能是show_time(foo)=inner),再执行inner
       #foo函数将会在装饰器中被调用

被装饰函数带参数的例子
1.实现两个数相加

import time
def show_time(f):
    def inner(x,y):    #add指向inner,现在add有两个实参要传,所以要给inner加两个形参来接收实参
        start = time.time()
        f(x,y)
        end=time.time()
        print('spend %s' %(end-start))
    return inner

@show_time
def add(a,b):
    print(a+b)
    time.sleep(2)

add(1,2)

2.实现多个数相加

import time
def show_time(f):
    def inner(*x):    #add指向inner,现在add有两个实参要传,所以要给inner加两个形参来接收实参
        start = time.time()
        f(*x)
        end=time.time()
        print('spend %s' %(end-start))
    return inner

@show_time
def add(*a):
    sum=0
    for i in a:
        sum+=i
    print(sum)
    time.sleep(2)

add(1,2,3,4)

装饰器加参数:

import time
def logger(flag):        #在装饰器里定义一个新函数,用来接收参数
    def show_time(f):
        def inner(*x):
            start = time.time()
            f(*x)
            end=time.time()
            print('spend %s' %(end-start))
            if flag==5:
                print('记录日志')
        return inner
    return show_time

@logger(5)  #@外层函数,则执行该函数并返回内层函数地址,紧接着执行内层函数
def add(*a):
    sum=0
    for i in a:
        sum+=i
    print(sum)
    time.sleep(2)

add(1,2,3,4)  #@谁,执行谁

 



转载于:https://www.cnblogs.com/Finance-IT-gao/p/10387053.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值