python装饰器

装饰器的基本框架

def wrapper(fn):   #1
    def inner(*args, **kwargs):  #2
        print("在fn前面执行的内容")  #3  in
        obj = fn(*args, **kwargs)    #4
        print(“在fn后面执行的内容”)  #5  out
        return obj   #6
    return inner   #7

@wrapper   #8  test_method = wrapper(test_method)
def test_method():    #9
    print("这是原函数")

test_method()  #10  wrapper.inner()
“”“
理解前提:
    1.#8是如何实现的:等价于=> test_method = wrapper(test_method); 返回的是内部函数inner
    2.#10是如何实现的:  等价于调用的装饰器的内部函数 test_method() = wrapper.inner()
每行的作用:
    #1是装饰器的名字,传递的形参fn是个函数;
    #2本质是个闭包函数,也是装饰器的内部函数,它的形参*args,**kwargs代表接收所有的位置参数和默认值参数,但是要注意接收进来后参数会变成元组(args1,args2),{"key1": "value1", "key2": "value2"}个格式;
    #3这部分可以添加要在fn函数之前执行的内容,比如进行数据库操作之前的,数据库连接操作;
    #4这部分是原函数的执行逻辑,同时将原函数的返回值赋值给局部变量obj,并通过#6返回;fn原函数里面的形参*args,**kwargs和inner函数里面的形参虽然写法一样,但是代表的含义完全不同。原函数里面的形参利用的特性是如何将一个列表或者元组或字典的数据类型的数据,拆开成一个个参数赋值给函数调用。
    list = [1,2,3]
    def chuancan("zhangsan", "lisi", "wangwu"):
        print("zhangsan", "lisi", "wangwu")
    chuancan(*list)

    #5表示在原函数后面要执行的内容,比如进行日志打印和操作记录
    #6这是在原函数有返回值时,配合#4进行原函数返回值获取用的
    #7这是返回内部函数,这里不能加(),因为需要返回的是内部函数,而不是内部函数的执行结果
    #8这是内部函数的调用语法,当使用多个装饰器的时候,记住执行规律即可
    @wrapper1
    @wrapper2
    func1(){...}    顺序:wrapper1.in > wrapper2.in > fn > wrapper2.out > wrapper1.out
    #9原函数的逻辑和功能,绝大部分的装饰器都可以按照上面的模板进行编写。

”“”

理解前提:
    1.#8是如何实现的:等价于=> test_method = wrapper(test_method); 返回的是内部函数inner
    2.#10是如何实现的:  等价于调用的装饰器的内部函数 test_method() = wrapper.inner()
每行的作用:
    #1是装饰器的名字,传递的形参fn是个函数;
    #2本质是个闭包函数,也是装饰器的内部函数,它的形参*args,**kwargs代表接收所有的位置参数和默认值参数,但是要注意接收进来后参数会变成元组(args1,args2),{"key1": "value1", "key2": "value2"}个格式;
    #3这部分可以添加要在fn函数之前执行的内容,比如进行数据库操作之前的,数据库连接操作;
    #4这部分是原函数的执行逻辑,同时将原函数的返回值赋值给局部变量obj,并通过#6返回;fn原函数里面的形参*args,**kwargs和inner函数里面的形参虽然写法一样,但是代表的含义完全不同。原函数里面的形参利用的特性是如何将一个列表或者元组或字典的数据类型的数据,拆开成一个个参数赋值给函数调用。
    list = [1,2,3]
    def chuancan("zhangsan", "lisi", "wangwu"):
        print("zhangsan", "lisi", "wangwu")
    chuancan(*list)

    #5表示在原函数后面要执行的内容,比如进行日志打印和操作记录
    #6这是在原函数有返回值时,配合#4进行原函数返回值获取用的
    #7这是返回内部函数,这里不能加(),因为需要返回的是内部函数,而不是内部函数的执行结果
    #8这是内部函数的调用语法,当使用多个装饰器的时候,记住执行规律即可
    @wrapper1
    @wrapper2
    func1(){...}    顺序:wrapper1.in > wrapper2.in > fn > wrapper2.out > wrapper1.out
    #9原函数的逻辑和功能,绝大部分的装饰器都可以按照上面的模板进行编写。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值