zoukankan      html  css  js  c++  java
  • [ Python

    装饰器有很多经典的使用场景,例如插入日志、性能测试、事务处理等等,有了装饰器,就可以提取大量函数中与本身功能无关的类似代码,从而达到代码重用的目的。

    装饰器有两种写法:

      1. 装饰器不传参数

      2. 装饰器自带参数

    第一种,装饰器不传参写法:

    def log1(func):
        @wraps(func)
        def wrapper(*args, **kw):
            print('%s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    
    # 第一种不带参数的装饰器调用
    @log1
    def fn1():
        print('2017-06-16')
    print(fn1())
    
    # 执行结果如下:
    # fn1():
    # 2017-06-16
    View Code

    第二种,装饰器自带参数写法:

    # 第二种,装饰器带参数写法:
    def log2(text):
        def decorator(func):
            def wrapper(*args, **kw):
                print('%s  %s()' %(text, func.__name__))
                return func(*args, **kw)
            return wrapper
        return decorator
    
    
    # 第二种带参数的装饰器调用
    
    @log2('hkey')
    def fn2():
        print('2017-06-16')
    
    print(fn2())
    
    # 执行结果如下:
    # hkey  fn2()
    # 2017-06-16
    View Code

    将两种装饰器合并起来的函数:

    # Author:hkey
    def log(text):
        if hasattr(text, '__call__'):
            def wrapper(*arg, **kw):
                print('%s():' %text.__name__)
                return text(*arg, **kw)
            return wrapper
        else:
            def decorator(func):
                def wrapper(*args, **kw):
                    print('%s():' %text)
                    return func(*args, **kw)
                return wrapper
        return decorator
    
    @log
    def f():
        print('2017-6-17')
    
    print(f())
    View Code
  • 相关阅读:
    深入分析Redis的主从复制机制
    Arctan的快速近似算法
    德布鲁因序列与indexing 1
    损失函数是学习的指挥棒—记一次实践经历
    二叉树的遍历回顾
    从卷积拆分和分组的角度看CNN模型的演化
    Inception系列回顾
    通俗易懂DenseNet
    ResNet详解与分析
    理解numpy中ndarray的内存布局和设计哲学
  • 原文地址:https://www.cnblogs.com/hukey/p/7028557.html
Copyright © 2011-2022 走看看