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

    python 装饰器

    描述

    • python 中一切皆对象,函数也可以当作参数传递

    • 装饰器就是接受一个函数作为参数,添加功能后返回一个新函数的函数或类。

    • python 中使用 @ 来使用装饰器。(@ 只是装饰器的语法糖,可以等价替代为其他)

    装饰器经常用到的功能就是在代码中添加 log 日志。

    实例

    下面简单编写一个记录函数耗时的装饰器。

    使用函数编写一个装饰器

    import time
    
    def log_time(func):     # 接受一个函数作为参数
        def _log(*args, **kwargs):
            beg = time.time()
            res = func(*args, **kwargs)
            print('use time:{}'.format(time.time() - beg))
            return res
        return _log
    
    @log_time       # 装饰器语法糖
    def mysleep():
        time.sleep(1)
    
    mysleep()
    
    """ @log_time 等价于:
        newsleep = log_time(mysleep)
        newsleep()
    """
    

    使用类编写一个装饰器

    import time
    
    class Logtime:
        def __call__(self, func):   #魔术方法
            def _log(*args, **kwargs):
                beg = time.time()
                res = func(*args, **kwargs)
                print('use time: {}'.format(time.time() - beg))
                return res
            return _log
    
    @Logtime()      # 注意这里和函数装饰器的区别
    def mysleep2():
        time.sleep(1)
    
    mysleep2()
    

    问题:如何给装饰器增加参数

    答: 使用类装饰器我们可以比较方便实现装饰器参数 -- 通过定义 __init__ 添加参数。

    以上面的代码为例,给装饰器添加一个参数

    import time
    
    class Logtime:
    
        def __init__(self, use_int = False):	# 定义默认参数
            self.use_int = use_int
    
        def __call__(self, func):   #魔术方法
            def _log(*args, **kwargs):
                beg = time.time()
                res = func(*args, **kwargs)
                if self.use_int:
                    print('use time: {}'.format(int(time.time() - beg)))
                else:
                    print('use time: {}'.format(time.time() - beg))
                return res
            return _log
    
    @Logtime(True)      # 装饰器参数
    def mysleep2():
        time.sleep(1)
    
    mysleep2()
    
  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/weixuqin/p/10831159.html
Copyright © 2011-2022 走看看