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

    装饰器作用:

    比如下面一个函数:

    def my_hello():
          print('Hello World!')
    
    
    my_hello()
    

    现在有一个要求,就是在打印 Hello World! 之前先打印 WTF!

    • 装饰器:
    def my_decorate(func):
        def inner():
            print('WTF')
            func()
        return inner
        
    @my_decorate
    def my_hello():
        print('Hello World!')
        
    
    my_hello()
    

    好处:解决代码重用,易于修改

    当函数带有参数时:

    def my_decorate(func):
            def inner(*args, **kwargs):
                print('WTF')
                func(*args, **kwargs)
            return inner
    
    
    @my_decorate
    def my_hello(str):
        print('Hello World! %s' % str)
    
    
    
    my_hello('HaHaHa')
    

    当函数带有返回值时:

    def my_decorate(func):
            def inner(*args, **kwargs):
                print('WTF')
                return func(*args, **kwargs)
            return inner
    
    
    @my_decorate
    def my_hello(str, a, b):
        print('Hello World! %s' % str)
        return a + b
    
    
    
    print(my_hello('HaHaHa', 1, 2))    # 当装饰器中没有 return func(*args, **kwargs) 的返回值时,会打印 None ,即空
    # 但是当打印函数私有属性 __name__ 时,会发现其变成了装饰器返回的函数名,即 inner
    print(my_hello.__name__)
    
    

    解决装饰器链式调用重名问题:

    from functools import wraps
    
    def my_decorate(func):
            @wraps(func)
            def inner(*args, **kwargs):
                print('WTF')
                return func(*args, **kwargs)
            return inner
    
    
    @my_decorate
    def my_hello(str, a, b):
        print('Hello World! %s' % str)
        return a + b
    
    
    my_hello('HaHaHa', 1, 2)
    print(my_hello.__name__)
    
  • 相关阅读:
    bzoj 5028小Z的加油店(D12 序列gcd)(线段树+树状数组)
    蒲公英
    [APIO2012]派遣(可并堆)(D11)
    AT1219 歴史の研究(回滚莫队)
    [USACO05DEC] 布局
    小B的询问
    [HEOI2012]采花(树状数组)(暑假D11)
    [JLOI2011]飞行路线 (暑假D3 拆点+dijkstra堆优化)
    [POI2012]FES-Festival
    [国家集训队]拉拉队排练
  • 原文地址:https://www.cnblogs.com/wjrblogs/p/13203000.html
Copyright © 2011-2022 走看看