• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    如何正确理解python装饰器

    一、闭包

    要想了解装饰器,首先要了解一个概念,闭包。什么是闭包,一句话说就是,在函数中再嵌套一个函数,并且引用外部函数的变量,这就是一个闭包了。光说没有概念,直接上一个例子。

    def outer(x):
        def inner(y):
            return x + y
        return inner
    
    print(outer(6)(5))
    -----------------------------
    >>>11

    如代码所示,在outer函数内,又定义了一个inner函数,并且inner函数又引用了外部函数outer的变量x,这就是一个闭包了。在输出时,outer(6)(5),第一个括号传进去的值返回inner函数,其实就是返回6 + y,所以再传第二个参数进去,就可以得到返回值,6 + 5。

    二、装饰器

    接下来就讲装饰器,其实装饰器就是一个闭包,装饰器是闭包的一种应用。什么是装饰器呢,简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。使用时,再需要的函数前加上@demo即可。

    def debug(func):
        def wrapper():
            print("[DEBUG]: enter {}()".format(func.__name__))
            return func()
        return wrapper
    
    @debug
    def hello():
        print("hello")
    
    hello()
    -----------------------------
    >>>[DEBUG]: enter hello()
    >>>hello

    例子中的装饰器给函数加上一个进入函数的debug模式,不用修改原函数代码就完成了这个功能,可以说是很方便了。

    三、带参数的装饰器

    上面例子中的装饰器是不是功能太简单了,那么装饰器可以加一些参数吗,当然是可以的,另外装饰的函数当然也是可以传参数的。

    def logging(level):
        def outwrapper(func):
            def wrapper(*args, **kwargs):
                print("[{0}]: enter {1}()".format(level, func.__name__))
                return func(*args, **kwargs)
            return wrapper
        return outwrapper
    
    @logging(level="INFO")
    def hello(a, b, c):
        print(a, b, c)
    
    hello("hello,","good","morning")
    -----------------------------
    >>>[INFO]: enter hello()
    >>>hello, good morning

    如上,装饰器中可以传入参数,先形成一个完整的装饰器,然后再来装饰函数,当然函数如果需要传入参数也是可以的,用不定长参数符号就可以接收,例子中传入了三个参数。

    四、类装饰器

    装饰器也不一定只能用函数来写,也可以使用类装饰器,用法与函数装饰器并没有太大区别,实质是使用了类方法中的__call__魔法方法来实现类的直接调用。

    class logging(object):
        def __init__(self, func):
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print("[DEBUG]: enter {}()".format(self.func.__name__))
            return self.func(*args, **kwargs)
    
    @logging
    def hello(a, b, c):
        print(a, b, c)
    
    hello("hello,","good","morning")
    -----------------------------
    >>>[DEBUG]: enter hello()
    >>>hello, good morning

    类装饰器也是可以带参数的,如下实现

    class logging(object):
        def __init__(self, level):
            self.level = level
    
        def __call__(self, func):
            def wrapper(*args, **kwargs):
                print("[{0}]: enter {1}()".format(self.level, func.__name__))
                return func(*args, **kwargs)
            return wrapper
            
    @logging(level="TEST")
    def hello(a, b, c):
        print(a, b, c)
    
    hello("hello,","good","morning")
    -----------------------------
    >>>[TEST]: enter hello()
    >>>hello, good morning

    好了,如上就是装饰器的一些概念和大致的用法啦,想更深入的了解装饰器还是需要自己在平时的练习和应用中多体会

    以上就是如何正确理解python装饰器的详细内容,更多关于python装饰器的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • python中有函数重载吗
    • 在Python中实现函数重载的示例代码
    • python装饰器原理源码示例分析
    • Python Pytest装饰器@pytest.mark.parametrize详解
    • 理解python中装饰器的作用
    • 详解Python装饰器 给你的咖啡加点料
    • python 装饰器的使用与要点
    • 如何利用饰器实现 Python 函数重载
    上一篇:详解python网络进程
    下一篇:浅谈python中的多态
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    如何正确理解python装饰器 如何,正确理解,python,装饰,