• 不可不知道的python装饰器


    前记

      python小白,估计很多没用过这个高级功能吧,当你用了它之后就会发现,真是非常好用喔。
      装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

    概念实例

    • 简单装饰器
        简单装饰器一般有两种写法,一种是直接定义函数,另外一种是使用@这个装饰器的语法糖来操作,下面以一个例子做结束:
    import logging
    
    def use_logging(func):
    
        def wrapper():
            logging.warning("%s is running" % func.__name__)
            return func()   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
        return wrapper
    
    def foo():
        print('i am foo')
    
    foo = use_logging(foo)  # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于  foo = wrapper
    foo()                   # 执行foo()就相当于执行 wrapper()
    
    @use_logging
    def apple():
        print("I am apple")
    
    
    apple()
    
    • 带参数的装饰器
        装饰器灵活性非常的高,它可以允许自带参数,这里就是一个自带参数的装饰器例子:
    import logging
    
    def use_logging(level):
    
        def decorator(func):
            def wrapper(*args, **kwargs):
                if level == "warn":
                    logging.warning("%s is running" % func.__name__)
                return func(*args)   # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
            return wrapper
        return decorator
    
    
    @use_logging(level="warn")
    def apple(name='apple'):
        print("I am %s "%name)
    
    
    apple("apple")
    
    
    • 类装饰器

      相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。相比函数装饰器,类装饰器具有灵活度大、高内聚、封装性等优点。下面看一个例子;

    class cat(object):
        def __init__(self,func):
            self._func = func
    
        def __call__(self):
            print("class decorator running")
            self._func()
            print("class decorator ending")
    
    
    @cat
    def bar():
        print("bar is running")
    
    bar()
    
    
  • 相关阅读:
    ThreadLocal应用场景以及源码分析
    ThreadLocal使用,应用场景,源码实现,内存泄漏
    ThreadLocal
    JBOSS默认连接池配置
    项目经验——jboss 配置数据库连接池
    InitialContext与lookup
    从零开发分布式数据库中间件 二、构建MyBatis的读写分离数据库中间件
    从零开发分布式数据库中间件 一、读写分离的数据库中间件
    appium+python自动化42-微信公众号
    appium+python自动化41-切换webview时候报chromedriver版本问题
  • 原文地址:https://www.cnblogs.com/dylancao/p/12410368.html
Copyright © 2020-2023  润新知