python之路--装饰器

本文深入讲解了Python中装饰器的概念及应用,包括通用装饰器的写法、带有参数的装饰器以及多个装饰器同时作用于同一函数的情况。通过实例演示了如何在不修改原函数的基础上为其增加新功能。

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

二 .通用装饰器的写法

  python里面的动态代理.

  存在的意义: 在不破坏原有的函数和原有函数的调用基础上,给函数添加新的功能

def wrapper(fn): #  fn是目标函数.
    def inner(*args, **kwargs): # 为了目标函数的传参
        '''在执行目标函数之前.....'''
        ret = fn(*args, **kwargs) # 调用目标函数, ret是目标函数的返回值
        '''在执行目标函数之后....'''
        return ret  # 把目标函数返回值返回. 保证函数正常的结束
    return inner
@wrapper  # target_func = wrapper(target_func)
def target_func():
    pass
target_func() # 此时执行的是inner

二 .带有参数的装饰器

def wrapper_out(flag): # 装饰器本身的参数
    def wrapper(fn): # 目标函数
        def inner(*args, **kwargs): # 目标函数执行需要的参数
            if flag == True:
                print("问问同学,看看有没有场地")
                ret = fn(*args, **kwargs) # 在执行目标函数之前
                print("同学骗我. 恨你")
                return ret
            else:
                ret = fn(*args, **kwargs)  # 在执行目标函数之前
                return ret
        return inner
    return wrapper
# # 语法糖 @装饰器
@wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器   再和@拼接  @装饰器
def play(): # 被 wrapper装饰
    print("走啊,打球去")
play()

 

三 .多个装饰器装饰同一个函数

def wrapper1(fn):
    def inner(*args, **kwargs):
        print("1111111")
        ret = fn(*args, **kwargs)
        print("2222222")
        return ret
    return inner
def wrapper2(fn):
    def inner(*args, **kwargs):
        print("3333333")
        ret = fn(*args, **kwargs)
        print("44444444")
        return ret
    return inner
def wrapper3(fn):
    def inner(*args, **kwargs):
        print("555555")
        ret = fn(*args, **kwargs)
        print("666666")
        return ret
    return inner
# 就近原则
@wrapper1
@wrapper2
@wrapper3
def func():
    print("我是可怜的func")
func()
# 1 2 3  func 3 2 1

 

  

转载于:https://www.cnblogs.com/attila/p/10120201.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值