python装饰器

本文深入探讨Python装饰器的本质及其应用原则,讲解如何利用高阶函数和嵌套函数实现装饰器,同时介绍nonlocal关键字的作用及用法,通过实例演示如何测量函数运行时间,并对reduce函数的使用进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰器:

本质是函数,装饰其他函数,就是为其他函数添加附加功能

原则:1 不能修改被装饰的函数代码

2 不能修改被装饰函数的调用方式

一个函数需要被多个装饰器装饰时,执顺序最下面装饰器,在一层一层往上执行

实现装饰器:

1函数即变量

2高阶函数:

把一个函数名当做实参传给另一个函数

返回值中包含函数名

3嵌套函数:

在一个函数体内用def去声明另一个函数

高阶函数+嵌套函数=装饰器

 

语法糖:@

在要装饰的函数上 @加装饰器函数名称

如果要装饰的函数需要参数,可加*args **kwargs

 

nonlocal:

如果要修改嵌套函数中作用域中的变量(enclosing 作用域,外层非全局作用域)

则需要 nonlocal 关键字了,

可以把函数嵌套内层的变量作用域于函数外层使用,

nonlocal 于global的区别:

global可以在全局使用,nonlocal只能在外层函数内使用

 

记录运行时间方法:

start=time.time()

stop=time.time()

 

reduce() 函数:

已经被从全局名字空间里移除了,它现在被放置在 fucntools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用

from functools import reduce

会对参数序列中元素进行累积。

reduce(参数有两个,可迭代对象) :统计

也可以用lambda列表生成式:

reduce(lambda x, y: x+y, [1,2,3,4,5])

 

#实现简单的装饰器
def bcd(aaa):
    def hh(j,h):
        aaa(j+3,h+3)
    return hh
@bcd
def abc(i, k):
    print(i * k)

if __name__ == "__main__":
    abc(2, 6)
#多个函数增加同一个装饰器
def zsq(fun):
    def s(*a):
        fun(*[i*i for i in a ])
    return s
@zsq
def abc(i,k):
    print(i*k)
@zsq
def abd(i,k,l):
    print(i*k*l)
if __name__ == "__main__":
    abc(2,6)
    abd(3,5,2)
#多个装饰器装饰一个函数
def zsq1(fun):  #fun代表装饰器zsq
    def t(i,k):
        print(fun(i,k)) #执行zsq()
        print(i+k) #执行zsq1功能
        return 9 #如果想要返回值 必须在最外层装饰器里面写返回值
    return t
def zsq(fun): #代表zbc函数
    def s(*a):
        return fun(*[i*i for i in a ])
    return s
@zsq1 #上层装饰器是装饰下层得
@zsq
def abc(i,k):
    print(i*k)

if __name__ == "__main__":
    print(abc(2,6))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值