Python3-装饰器入门

基础学习

菜鸟上讲的很清楚~
Python 函数装饰器

自我理解

直接代码吧

###############################【被装饰的函数, 不带参数, 无返回值】###############################
def decorator_A(func):
    def wrap_func():
        print("开始装饰")
        func()
        print("结束装饰")
    return wrap_func

@decorator_A  # 等价于: func_A=decorator_A(func_A)=wrap_func
def func_A():
    print("AAAAA")

###############################【被装饰的函数, 带参数, 无返回值】###############################
def decorator_B(func):
    def wrap_func(param1):
        print("开始装饰")
        func(param1)
        print("结束装饰")
    return wrap_func

@decorator_B  # 等价于: func_A=decorator_A(func_A)=wrap_func, 即调用func_B(99)时,实际上是调用wrap_func(99) 所以wrap_func函数需要接受这个参数
def func_B(param1):
    print("BBBBB", param1)


# -----延伸: 原函数无参数,wrap_func带参数(但一般不这样使用)
def decorator_C(func):
    def wrap_func(param1):
        print("开始装饰")
        func()
        print(param1)
        print("结束装饰")
    return wrap_func

@decorator_C
def func_C():
    print("CCCCC")

# func_C() # 此时这样调用是错误的,正如上边所说,虽然函数名为func_C, 但其实调用的是wrap_func

###############################【被装饰的函数, 带参数, 有返回值】###############################

def decorator_D(func):
    def wrap_func(param1):
        print("开始装饰")
        return_data = func(param1) # 原函数返回值
        print("结束装饰")
        return return_data
    return wrap_func

@decorator_D
def func_D(param):
    print("DDDDD")
    return param

###############################【装饰器函数,带参数】###############################

# 需要在外层再加一层
def decorator_E(param1):
    # 这里是对装饰器参数的一些处理,eg:
    print("装饰器参数",param1)
    # 以下同上
    def decorator_e(func):
        def wrap():
            print("开始装饰")
            func()
            print("结束装饰")
        return wrap
    return decorator_e

@decorator_E("decorator_param")  #等价于:@decorator_e,即相当于先decorator_E("decorator_param"),结果为decorator_e,然后@decorator_e  注:加载时就已经执行了decorator_E("decorator_param")
def func_E():
    print("EEEEE")


if __name__ == "__main__":
    print("-"*100)
    func_A()
    print("-"*100)
    func_B("方法B参数")
    print("-"*100)
    func_C("方法C参数")
    print("-"*100)
    return_data = func_D("方法D参数")
    print(return_data)
    print("-"*100)
    func_E()

结果如下:

装饰器参数 decorator_param
----------------------------------------------------------------------------------------------------
开始装饰
AAAAA
结束装饰
----------------------------------------------------------------------------------------------------
开始装饰
BBBBB 方法B参数
结束装饰
----------------------------------------------------------------------------------------------------
开始装饰
CCCCC
方法C参数
结束装饰
----------------------------------------------------------------------------------------------------
开始装饰
DDDDD
结束装饰
方法D参数
----------------------------------------------------------------------------------------------------
开始装饰
EEEEE
结束装饰

几点说明:

1、装饰器函数带参数时,会在函数加载时加载其内容,所以有了第一行的输出;
2、被修饰函数有参数时,可以以不定参数的形式传递,适用性更强;
3、为了展示,所有的例子都没有带@wrap(func) ,使用时可以加上,以保持装饰前后函数名和注释文档的一致性。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值