Python装饰器

本文详细介绍了Python装饰器的概念,它本质上是闭包的语法糖,用于在不修改原函数代码的情况下添加额外功能。文中通过实例展示了如何创建和使用装饰器,包括带参数的装饰器,并探讨了如何利用装饰器实现如计时、日志记录等功能。同时,文章还讨论了如何在装饰器中传递参数,以及如何使用装饰器装饰装饰器,提供了一种灵活的代码组织方式。
摘要由CSDN通过智能技术生成

装饰器本质是闭包的语法糖。
Python装饰器的为了给被修饰函数,添加额外功能,这种添加功能的方式能够在不改变原函数形式的条件下,添加额外功能

# def getzsq(char):
#     def check(func):   这是修饰函数(也是外函数)
#         a = 10000
#         def inner(b):     这是内函数
#             print("登录验证", b, char)
#             ret  = func(b, char)   这是被修饰函数
#             return ret
#         return inner
#     return check
# 外函数与内函数组的成闭包
# @getzsq("oooo")
# # fss:其实是inner内函数 = check(fss:被修饰函数)
# def fss(x, y):
#     print("发说说", x, y)
#
# # fss = check(fss)
#
# if __name__ == '__main__':
#     fss(1)


# class chen():
#     def __init__(self):
#         print(id(self))
#
# p = chen()
# print(id(p))
import time
def zsq(func):
    startime = time.time()
    def inner():
        func()
        time.sleep(3)
        endtime = time.time()
        print(endtime-startime)
    return inner
@zsq
def p():
    kong = []
    for i in range(1000):
        kong.append(i)
    # print(kong)
# p函数是为被修饰函数,被修饰完在调用已经添加了额外的计时功能
if __name__ == '__main__':
    p()

一句话来说,@zsq这就等同于p = zsq(p),右边这个p很好理解就是p函数对象,左边这个p是inner,是inner,是inner,重说三。如果p函数是有参数输入的,那么inner必须要接受。

def decorete(func):
    def aim(*args):
        ret1 = func(*args)
        print("输出%s" % args)
        return ret1+100000
    return aim

# decorete(aim)(10)

@decorete  # aim = decorete(aim)
def aim(x):  #111111111111111
    print("%s被装饰了" % x)
    return 1
# aim = decorete(aim)
ret2 = aim(10))

再一句话来说,decorete装饰函数中的func函数返回值ret1就是111111111111处的aim的返回值,ret2的也就等同于 ret+100000

def getp(p):
	def decorete(func):
	    def aim(*args):
	        ret1 = func(*args)
	        print("输出%s" % args)
	        print("输出%s" % p)
	        return ret1+100000
	    return aim
	return decorete

# decorete(aim)(10)

@getp("zsq_per")  # aim = decorete(aim)
def aim(x):  #111111111111111
    print("%s被装饰了" % x)
    return 1
# aim = decorete(aim)
ret2 = aim(10))

再再一句话,如果装饰器需要传递参数咋办?这样写?@decorete(“zsq_per”),肯定不行因为装饰器是固定格式aim = decorete(aim),如果这么写@decorete(“zsq_per”),zsq_per是aim么,坑定不是。
再用一个函数来装饰装饰器.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV_er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值