zoukankan      html  css  js  c++  java
  • Python使用偏函数与类实现装饰器

    # -*- coding: utf-8 -*-
    # author:baoshan
    # python对某个对象是否能通过装饰器形式使用只有一个要求:decorator必须是一个可被调用的对象。
    # 我们最熟悉的就是函数了
    # 除函数之外,类也可以是callable对象,只要实现了__call__函数。
    
    # 如下DelayFunc是一个实现了__call__的类,delay返回一个偏函数,在这里delay就可以作为一个装饰器
    
    
    import time
    import functools
    
    class DelayFunc:
        def __init__(self, duration, func):
            self.duration = duration
            self.func = func
    
        def __call__(self, *args, **kwargs):
            print('Wait for {duration} seconds...'.format(duration=self.duration))
            time.sleep(self.duration)
            return self.func(*args, **kwargs)
    
        def eager_call(self, *args, **kwargs):
            print('Call without delay')
            return self.func(*args, **kwargs)
    
    def delay(duration):
        """
        装饰器:推迟某个函数的执行。
        同时提供 .eager_call方法立即执行
        """
        # 此处为了避免定义额外函数,直接调用functools.partial帮助构造
        return functools.partial(DelayFunc, duration)
    
    @delay(duration=2)
    def add(a, b):
        return a + b
    
    print(add)
    print('-'*20)
    print(add(3,5))
    print('-'*20)
    print(add.func)

    输出结果:

    <__main__.DelayFunc object at 0x0000029A5B61DA58>
    --------------------
    Wait for 2 seconds...
    8
    --------------------
    <function add at 0x0000029A627FDD08>

    参考自:https://zhuanlan.zhihu.com/p/65968462

    谢谢!

  • 相关阅读:
    Shape详解
    C#装箱与拆箱
    C#值类型、引用类型的区别
    C#类型简述
    C# 关键字列表
    python图片转字符画
    软件测试面试题
    python关键字以及含义,用法
    JMeter的那些问题
    APP测试功能点
  • 原文地址:https://www.cnblogs.com/zhzhang/p/11377008.html
Copyright © 2011-2022 走看看