转:如何更通俗地讲解Python的装饰器?

本文参考:

廖雪峰:装饰器 (推荐)

 

如何更通俗地讲解Python的装饰器?

理解 Python 装饰器看这一篇就够了

 

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于插入日志、性能测试、事务处理、缓存、权限校验等场景。

 

示例1:简单装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import logging
 
def use_logging(func):
  
    def wrapper():
        logging.warning('{} is running'.format(func.__name__))
        return func()   # 把foo当做参数传递进来时,执行func()就相当于执行foo()
    return wrapper
  
def foo():
    print('i am foo')
  
ff = use_logging(foo)  # 因为装饰器use_logging(foo)返回的是函数对象wrapper,这条语句相当于ff=wrapper
ff()                   # 执行ff()就相当于执行wrapper()

 

示例2:语法糖

1
2
3
4
5
6
7
8
9
10
11
12
def use_logging(func):
 
    def wrapper():
        logging.warn("%s is running" % func.__name__)
        return func()
    return wrapper
 
@use_logging
def foo():
    print("i am foo")
 
foo()

 

示例3:业务函数test带参数

1
2
3
4
5
6
7
8
def wrapper(name):
        logging.warn("%s is running" % func.__name__)
        return func(name)
    return wrapper
 
@use_logging
def foo(name):
    print("i am %s" % name)

  

1
2
3
4
5
6
7
8
9
10
def square_it(fn):
    def warp(*args):
        return fn(*args)**2
    return warp
 
@square_it
def test(x):
    return x + 2
 
print(test(2))

  

示例4:带参数的装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def use_logging(level):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if level == "warn":
                logging.warn("%s is running" % func.__name__)
            elif level == "info":
                logging.info("%s is running" % func.__name__)
            return func(*args)
        return wrapper
 
    return decorator
 
@use_logging(level="warn")
def foo(name='foo'):
    print("i am %s" % name)
 
foo()

 

posted @   Picassooo  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2020-08-13 转:pytorch permute()函数
2020-08-13 PyTorch,LSTM,batch_first=True
点击右上角即可分享
微信分享提示