zoukankan      html  css  js  c++  java
  • 装饰器

    装饰器

    什么是装饰器

    装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

    装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

    装饰器的形成过程

    import time 
    def func1():
        print("in func1")
    ​
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    ​
    func1 = timer(func1)
    func1()

    每次执行func1 = timer(func1)会很麻烦,python提供了一个简单的方法:语法糖。

    import time 
    ​
    def timer(func):
        def inner():
            start = time.time()
            func()
            print(time.time() - start)
        return inner
    ​
    @timer  # --> func1 = timer(func1)
    def func1():
        print("in func1")
    ​
    func1()

    带参数的装饰器

    import time
    ​
    def timer(func):
        def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
        return inner
    ​
    @timer
    def func1(a):
        print(a)
    ​
    func1()
    import time
    def timer(func):
        def inner(*args, **kwargs):
            start = time.time()
            re = func(*args, **kwargs)
            print(time.time() - start)
            return re
        return inner
    ​
    @timer
    def func1(a, b):
        print("in func1")
    ​
    @timer
    def func2(a):
        print("in func2 and get a:%s" % a)
        return "func2 over"
    ​
    func1("aaaaaa", "bbbbbb")
    print(func2("aaaaaa"))

    查看函数信息的方法:

    from functools import wraps
    ​
    def deco(func):
        @wraps(func)  # 加在最内层函数正上方
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper
    ​
    @deco
    def index():
        """哈哈哈哈"""
        print("from index")
        
    print(index.__doc__)
    print(index.__name__)

    开放封闭原则

    1.对扩展是开放的

    2.对修改时封闭的

    装饰器的主要功能和固定结构

    def timer(func):
        def inner(*args, **kwargs):
            """执行函数之前要做的"""
            re = func(*args, **kwargs)
            """执行函数之后要做的"""
            return re
        return inner
    from functools import wraps
    ​
    def deco(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)
        return wrapper

    如何去掉装饰器

    def outer(flag):
        def timer(func):
            def inner(*args, **kwargs):
                """执行函数之前要做的"""
                re = func(*args, **kwargs)
                """执行函数之后要做的"""
                return re
            return inner
        return timer
    ​
    @outer(False)
    def func():
        print(111)
    func()

    多个装饰器装饰一个函数

    def wrapper1(func):
        def inner():
            print("wrapper1, before func")
            func()
            print("wrapper1, after func")
        return inner
    ​
    def wrapper2(func):
        def inner():
            print("wrapper2, before func")
            func()
            print("wrapper2, after func")
        return inner
    ​
    @wrapper2
    @wrapper1
    def f():
        print("in f")
    f()

     

  • 相关阅读:
    三.Python数据类型详述
    二.Python基础语法和数据类型
    一.Python特点
    Hive之explode和lateral view
    javascript之函数作用域
    javascript之函数使用
    javascript之函数定义
    javascript之变量
    Html之元素
    Html之页面
  • 原文地址:https://www.cnblogs.com/yaoyanxin007/p/10566430.html
Copyright © 2011-2022 走看看