装饰器:调用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()

运行结果:

python函数内能调用外部函数嘛 python内层函数调用外层函数_函数返回

def han3():
    print('这是han3')
    def han4():
        print('这是han4')
    return han4()
han3()

运行结果:

python函数内能调用外部函数嘛 python内层函数调用外层函数_python_02


所以到装饰器的时候我就疑惑了,装饰器的外层函数返回的是函数名,但是显然的内层函数也执行了,我就试了下面两种方式:

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)

运行 结果:

python函数内能调用外部函数嘛 python内层函数调用外层函数_函数返回_03


在调用han2的适合加上()之后

def han1(func):
    print('这是han1')
    def han():
        print('这是han')
        return func()
    return han
@han1
def han2():
    return '这是han2'
print(han2())

运行结果:

python函数内能调用外部函数嘛 python内层函数调用外层函数_python函数内能调用外部函数嘛_04

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())

python函数内能调用外部函数嘛 python内层函数调用外层函数_python函数内能调用外部函数嘛_05

def han1(func):
    print('这是han1')
    def han():
        print('这是han')
        func()
    return han
@han1
def han2():
    print('不return')
    return '这是han2'
print(han2())

python函数内能调用外部函数嘛 python内层函数调用外层函数_函数返回_06