装饰器:调用hanshu2(原始功能)的时候会去调用hanshu1(扩展功能)
@hanshu1(标识)
def hanshu1(func):
print('这里是函数1')
def zhongjian():
print('这里是中间函数')
func()
# print('call%s'%hanshu2.__name__)
return zhongjian
@hanshu1
def hanshu2():
print('这里是函数2')
hanshu2()
D:\anaconda\python.exe E:/pythonProject/类.py
这里是函数1
这里是中间函数
这里是函数2
Process finished with exit code 0
关于装饰器的疑惑
1.为啥装饰器的函数返回的是内层函数的函数名,不是函数名+();按理说一般的函数返回函数名返回的这个函数根本不会执行
首先是一般函数而言,外层函数如果只是返回函数名的话,根本不会调用到内层函数,只有外层函数return 函数名()的时候内层函数才会执行
一般函数:
def han3():
print('这是han3')
def han4():
print('这是han4')
return han4
han3()
运行结果:
def han3():
print('这是han3')
def han4():
print('这是han4')
return han4()
han3()
运行结果:
所以到装饰器的时候我就疑惑了,装饰器的外层函数返回的是函数名,但是显然的内层函数也执行了,我就试了下面两种方式:
1.1 在调用原始函数han2的时候(不加()的时候),这个时候函数运行只运行了外层函数并返回了<function han1..han at 0x000001DE5719B558>,意思是返回了一个内层函数,但是没有运行;
1.2 在调用han2的时候加上()呢,这个时候就执行了内层函数han()
原因:在调用han2()的时候,实际上执行的是装饰器han1(),han2这个方法作为一个参数传递给han1,han1执行之后返回han,han+()(这个()是调用han2的())这个时候就执行han()了
装饰器:
def han1(func):
print('这是han1')
def han():
print('这是han')
return func()
return han
@han1
def han2():
return '这是han2'
print(han2)
运行 结果:
在调用han2的适合加上()之后
def han1(func):
print('这是han1')
def han():
print('这是han')
return func()
return han
@han1
def han2():
return '这是han2'
print(han2())
运行结果:
2.为啥内层函数在调用了原始函数要return一下
return返回的结果要显示出来,只能用print函数打印出来
执行装饰器的时候,执行到han2的时候(也就是原始函数的时候),不为了不使原始函数的功能受到影响(return的值),需要再return一下,最后通过print打印出来
def han1(func):
print('这是han1')
def han():
print('这是han')
return func()
return han
@han1
def han2():
print('不return')
return '这是han2'
print(han2())
def han1(func):
print('这是han1')
def han():
print('这是han')
func()
return han
@han1
def han2():
print('不return')
return '这是han2'
print(han2())