【Python】装饰器与内部函数简单理解

系统 1382 0

1、 内部函数 ,顾名思义,是函数内部定义的函数,其作用是封装逻辑,使函数逻辑更为清晰。

            
              def outer():
    inner():
        业务逻辑
    return inner
            
          

2、 为何return inner而不是return inner()呢?

初学者可能都有此一问,我们知道,运行一个函数就是:func(),然后func会得出结果。同理,如果return inner()就是要返回inner()的运算结果,但是innner()函数没有返回值,此时return inner()只能得到None。而retrun inner是返回inner这个函数,并不会运行这个函数。

总结:

return innner返回函数逻辑代码,不运行函数

return inner()运行inner函数,将函数结果返回

3、 装饰器

装饰器用到的就是内部函数。如下,若把需要装饰的函数称之为目标函数,定义装饰器decorator,把目标函数作为参数传给decorator函数,然后定义内部函数wrapper,wapper用于包装目标函数,包装完毕后将wrappper函数返回。

由此,可以看出,decorator函数只是返回wrapper的逻辑代码,并不会运行wrapper

            
              def decorator(func):
    def wrapper():
        print('start')
        func()
        print('end')
    return wrapper()

@decorator
def myfunc():
    print('run')
    
myfunc()
            
          

上述代码就是将myfunc函数作为参数传递给decorator函数,然后decorator函数中的内部函数wrapper函数调用了myfunc函数,并对其进行了简单包装,最后直接把wrapper中的逻辑返回。

运行结果:

【Python】装饰器与内部函数简单理解_第1张图片

若需要加参数,如下:

            
              def log(text):
    def deco(func):
        def wrapper(*args,**kw):
            print text
            func(*args,**kw)
            print text + " again"
        return wrapper
    return deco
     
@log("hello")
def myfun(message):
    print message
     
myfun("world")
 
# 运行结果
# hello
# world
# hello again
            
          

4、 闭包

上面的wrapper函数就是闭包,闭包就是内部函数的一种。

具体可参考https://www.cnblogs.com/Lin-Yi/p/7305364.html

5、 Nonetype报错

初学者在利用装饰器时,可能会碰上这个报错,何也?

其实是因为装饰器返回不当,装饰器本来应该返回一个函数,但是却没有返回,会引发此错误。检查代码,看看是否return语句嵌套不当,即可解决。


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论