装饰器的基本框架
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原函数的逻辑和功能,绝大部分的装饰器都可以按照上面的模板进行编写。