zoukankan      html  css  js  c++  java
  • python装饰器的简单实用

    装饰器(Decorators)可以实现在不变原有python 代码功能的基础上增加功能代码。

    框架

    def outer2(func):
        def inner(*args, **kwargs):
            func(*args, **kwargs)
        return inner
    
    
    @outer2
    def foo(a, b, c):
        print (a+b+c)
    

      

    示例一:

    import time
    from functools import wraps
    
    
    def time_checker(func):
        @wraps(func)
        def inner(*args, **kwargs):
            time_start = time.time()
            ret = func(*args, **kwargs)
            print(f'{func.__name__} running time is {time.time() - time_start} 秒')
            return ret
        return inner
    
    
    @time_checker
    def func1():
        time.sleep(1)
        print(f'now func1 is  running')
    
    
    if __name__ == '__main__':
        func1()
    

     示例二:

    from functools import wraps
    
    
    def logit(logfile='out.log'):
        def logging_decorator(func):
            @wraps(func)
            def wrapped_functions(*args, **kwargs):  
                log_string = func.__name__ + ' was called'
                print(log_string)
                with open(logfile, 'a') as opend_files:
                    opend_files.write(log_string + '
    ')
                return func(*args, **kwargs)
            return wrapped_functions
        return logging_decorator
    
    
    @logit
    def myfunc1():
        pass
    

      示例三

    def outer_arg(bar):
        def outer(func):
            def inner(*args, **kwargs):
                ret = func(*args, **kwargs)
                print(bar)
                return ret
            return inner
        return outer
    
    # 相当于 outer_arg('foo_arg')(foo)()
    
    
    @outer_arg('foo_arg')
    def foo(a, b, c):
        return (a+b+c)
    
    
    print(foo(1,3,5))
    

      示例四

    class Count(object):
        def __init__(self, func):
            self._func = func
            self.num_calls = 0
    
        def __call__(self, *args, **kwargs):  # 模拟成函数,将类模拟成可调用的对象
            self.num_calls += 1
            print(f'num of call is {self.num_calls}')
    
    
    @Count
    def example():
        print('hello')
    

      示例五

    def decorator(aClass):
        class newClass(object):
            def __init__(self, args):
                self.times = 0
                self.wrapped = aClass(args)
    
            def display(self):
                # 将runtime()替换为display()
                self.times += 1
                print('run times ', self.times)
                self.wrapped.display()
    
        return newClass
    
    @decorator
    class MyClass(object):
        def __init__(self, number):
            self.number = number
    
        # 重写display
        def display(self):
            print('number is', self.number)
    
    
    six = MyClass(6)
    for i in range(5):
        six.display()
    

      

  • 相关阅读:
    JavaScript数字精度丢失问题总结
    前端开发调试线上代码的两款工具
    微信公众账号开发入门
    Chrome/Firefox 中头toFixed方法四舍五入兼容性问题
    GIT/node使用
    addEventListener 的另类写法
    JavaScript 动态插入 CSS
    JavaScript判断各浏览器CSS前缀的两种方式
    流程办理操作说明
    流程设计器(2)
  • 原文地址:https://www.cnblogs.com/workherd/p/14401916.html
Copyright © 2011-2022 走看看