关键词搜索

源码搜索 ×
×

Python笔记-函数装饰器

发布2020-02-25浏览4701次

详情内容

在调用某个方法前,想调用一些额外的东西。

个人感觉就和C++里面,带一个函数指针的的参数,在某个函数执行前,调用这个函数指针,或者,在某个函数中,直接调用这个函数。比如插入日志等。功能。

 

但在python可以使用@标识符,进行函数装饰器

这个和java反射有异曲同工之妙(应该说注解,但注解的本质就是反射)

如下python

  1. def bar1():
  2. print("[debug] bar1 is running")
  3. print("i am bar1")
  4. def bar2():
  5. print("[debug] bar2 is running")
  6. print("i am bar2")
  7. if __name__ == "__main__":
  8. bar1()
  9. bar2()

程序运行截图如下:

开始用了,最原始的方式

  1. def use_logging(func_name):
  2. #print("[debug]" + func_name + "is running")
  3. print("[debug] %s is running" % func_name)
  4. def bar1():
  5. use_logging("bar1")
  6. print("i am bar1")
  7. def bar2():
  8. use_logging("bar2")
  9. print("i am bar2")
  10. if __name__ == "__main__":
  11. bar1()
  12. bar2()
这里就是在函数里面调用其他函数,
下面是使用古老装饰器模式方式:
 

使用装饰器,这个是古老的方式,用C/C++来理解就是func是一个函数指针,use_logging函数把func的名字打印后,把指针返回来,然后给bar1,bar1再调用,即可

  1. def use_logging(func):
  2. def wrapper(*args, **kwargs):
  3. print("[debug] %s is running" % func.__name__)
  4. return func(*args, **kwargs)
  5. return wrapper
  6. def bar1():
  7. print("i am bar1")
  8. def bar2():
  9. print("i am bar2")
  10. if __name__ == "__main__":
  11. bar11 = use_logging(bar1)
  12. bar11()
  13. bar22 = use_logging(bar2)
  14. bar22()

程序运行截图如下:

下面是新时代写法,和Java注解差不多,从这里可以看到Java和Python写代码,的确比C/C++爽。

  1. def use_logging(func):
  2. def wrapper(*args, **kwargs):
  3. print("[debug] %s is running" % func.__name__)
  4. return func(*args, **kwargs)
  5. return wrapper
  6. @use_logging
  7. def bar1():
  8. print("i am bar1")
  9. @use_logging
  10. def bar2():
  11. print("i am bar2")
  12. if __name__ == "__main__":
  13. bar1()
  14. bar2()

程序运行截图如下:

下面是带参数的函数装饰器

  1. def use_logging(level = "debug"):
  2. def decorator(func):
  3. def wrapper(*args, **kwargs):
  4. print("[%s] %s is running" % (level, func.__name__))
  5. return func(*args, **kwargs)
  6. return wrapper
  7. return decorator
  8. @use_logging()
  9. def bar1():
  10. print("i am bar1")
  11. @use_logging(level = "error")
  12. def bar2():
  13. print("i am bar2")
  14. if __name__ == "__main__":
  15. bar1()
  16. bar2()

程序运行截图如下:

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载