美文网首页
Python装饰器

Python装饰器

作者: lk_erzanml | 来源:发表于2021-01-29 13:32 被阅读0次
#它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

# 1.需求1,计算函数执行时间

def compute_time(func):
    from functools import wraps
    import time
    @wraps(func)
    def wrapper(*args,**kwargs):
        """
        I am wrapper!
        :param args:
        :param kwargs:
        :return:
        """
        start_time=time.time()
        func(*args,**kwargs)
        print("总消耗时间:{}s".format(time.time()-start_time))
    return wrapper

#2.校验参数格式,必须大于0,小于100

def jiaoyan_args(func):
    from functools import wraps
    @wraps(func)
    def wrapper(*args,**kwargs):
        n=args[0]
        if n>100 or n<0:
            return "输入错误"
        return func(*args,**kwargs)
    return wrapper


#带参数的装饰器
import time
import functools


def log(kind):
    def add_log(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            start_time = time.time()
            res = func(*args, **kwargs)
            end_time = time.time()
            print('<%s> [%s] 函数名:%s,运行时间:%.6f,运行返回值的结果'
                  ':%d' % (kind, time.ctime(), func.__name__,
                           end_time - start_time, res))
            return res

        return wrapper

    return add_log


@log('debug')
def add():
    time.sleep(1)
    return 1 + 1


@log('debug')
def sub():
    time.sleep(1)
    return 2 - 1

#类装饰器
import time
class Foo():
    def __init__(self, func):    # 初始化函数中传入函数对象的参数
        self._func = func
    def __call__(self):    # 定义__call__方法,直接实现装饰功能
        start_time = time.time()
        self._func()
        end_time = time.time()
        print('花费了 %.2f' % (end_time - start_time))

@Foo  # bar=Foo(bar)
def bar():
    print('bar函数的执行时间为:')
    time.sleep(2.5)

bar()    # bar=Foo(bar)(),没有嵌套关系了,直接执行Foo的 __call__方法,实现装饰功能











if __name__=="__main__":

    @compute_time
    def nead_something(n):
        """
        返回一个数的平方
        :param n:
        :return:
        """
        print(n**2)
        return n**2

    # nead_something(10)
    # print(nead_something.__name__)#被改变了
    # print(nead_something.__doc__)
    #加了语法糖@wraps(func)就不改变__name__和__doc__了

    @jiaoyan_args
    def nead_something1(n):
        """
        返回一个数的平方
        :param n:
        :return:
        """
        return n**2

    # print(nead_something1(1001))


    # print(add())
    # print(sub())

相关文章

  • 装饰器模式

    介绍 在python装饰器学习 这篇文章中,介绍了python 中的装饰器,python内置了对装饰器的支持。面向...

  • python中的装饰器

    python装饰器详解 Python装饰器学习(九步入门) 装饰器(decorator) 就是一个包装机(wrap...

  • [译] Python装饰器Part II:装饰器参数

    这是Python装饰器讲解的第二部分,上一篇:Python装饰器Part I:装饰器简介 回顾:不带参数的装饰器 ...

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • Python进阶——面向对象

    1. Python中的@property   @property是python自带的装饰器,装饰器(decorat...

  • Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方

    Python 装饰器简介装饰器(Decorator)是 Python 非常实用的一个语法糖功能。装饰器本质是一种返...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

  • 2019-05-26python装饰器到底是什么?

    装饰器例子 参考语法 装饰器是什么?个人理解,装饰器,是python中一种写法的定义。他仍然符合python的基本...

  • 2018-07-18

    Python装饰器 装饰,顾名思义,是用来打扮什么东西的。Python装饰...

网友评论

      本文标题:Python装饰器

      本文链接:https://www.haomeiwen.com/subject/knnzaktx.html