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

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

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

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

如下python

def bar1():print("[debug] bar1 is running")print("i am bar1")def bar2():print("[debug] bar2 is running")print("i am bar2")if __name__ == "__main__":bar1()bar2()

程序运行截图如下:

开始用了,最原始的方式

def use_logging(func_name):#print("[debug]" + func_name + "is running")print("[debug]  %s is running" % func_name)def bar1():use_logging("bar1")print("i am bar1")def bar2():use_logging("bar2")print("i am bar2")if __name__ == "__main__":bar1()bar2()
这里就是在函数里面调用其他函数,
下面是使用古老装饰器模式方式:

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

def use_logging(func):def wrapper(*args, **kwargs):print("[debug]  %s is running" % func.__name__)return func(*args, **kwargs)return wrapperdef bar1():print("i am bar1")def bar2():print("i am bar2")if __name__ == "__main__":bar11 = use_logging(bar1)bar11()bar22 = use_logging(bar2)bar22()

程序运行截图如下:

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

def use_logging(func):def wrapper(*args, **kwargs):print("[debug]  %s is running" % func.__name__)return func(*args, **kwargs)return wrapper@use_logging
def bar1():print("i am bar1")@use_logging
def bar2():print("i am bar2")if __name__ == "__main__":bar1()bar2()

程序运行截图如下:

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

def use_logging(level = "debug"):def decorator(func):def wrapper(*args, **kwargs):print("[%s]  %s is running" % (level, func.__name__))return func(*args, **kwargs)return wrapperreturn decorator@use_logging()
def bar1():print("i am bar1")@use_logging(level = "error")
def bar2():print("i am bar2")if __name__ == "__main__":bar1()bar2()

程序运行截图如下:

Python笔记-函数装饰器相关推荐

  1. Python笔记-函数装饰器的缺点

    装饰器的好处,复用了代码,缺点就是原函数的元信息不见了 比如函数docstring._name_.参数列表 如下代码: def use_logging(level = "debug" ...

  2. 初学者python笔记(装饰器、高阶函数、闭包)

    一个函数被定义完成后,甚至程序发布后,后期可能需要添加某些功能,但是我们不可能每次都去修改原函数的代码,这时候装饰器就可以上场了,本篇文章将会用一个个可实现的代码,由浅入深.循序渐进得阐述装饰器的强大 ...

  3. 初学者python笔记(装饰器后篇:登陆验证)

    装饰器有非常强大的功能,可以不修改函数源代码和调用方式,就给函数加上了对应想要的功能,简直就是 修饰函数的利器. 上一篇文章:初学者python笔记(装饰器.高阶函数.闭包)已经非常详细的剖析了装饰器 ...

  4. python中tracer函数意思_浅析Python编写函数装饰器

    本节主要介绍编写函数装饰器的相关内容. 跟踪调用 如下代码定义并应用一个函数装饰器,来统计对装饰的函数的调用次数,并且针对每一次调用打印跟踪信息. 这是一个通过类装饰的语法写成的装饰器,测试如下: 运 ...

  5. Python笔记-类装饰器

    使用类装饰器还可以依靠类内部的__call__方法,但使用@形式将装饰器附加到函数上时,就会调用此方法. 如下代码: class Foo(object):def __init__(self, func ...

  6. python 笔记:装饰器

    1 装饰器介绍 如果有一批函数都是需要前置或者后置的工作,那么我们可以统一使用装饰器进行修饰. 1.1 不用装饰器的版本 def decorator(fn, name):print("I'm ...

  7. python 闭包_一起看流畅的python:函数装饰器和闭包

    装饰器 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数).装 饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个 函数或可调用对象. 装饰器的一个关键特性是,它们在被装饰的函数定义 ...

  8. python 匿名函数装饰器

    匿名函数 关键字lambda表示匿名函数,冒号前面的x表示函数参数 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. >>> list(map( ...

  9. python装饰器函数-Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

最新文章

  1. CGIC简明教程(转摘)
  2. android对OnTouchListener、OnClickListener等事件响应的研究
  3. Failed to execute
  4. Java已死?九百万程序员说不
  5. JS 动态清除Div中内容
  6. mysql事件的使用-开启与关闭事件
  7. python函数可以改变哪种数据类型的实参_表达式1+2*3.140的结果类型是():_学小易找答案...
  8. docker进阶与实战 3 理解docker镜像
  9. Linux-SHELL基本操作
  10. linux逻辑卷管理(LVM)
  11. 在VC中使用SendInput函数实现中文的自动输入
  12. Google搜索从入门到精通 v4.0
  13. Eclipse小工具 TCP/IP Monitor
  14. Qt5.2.1 + VS2012 环境配置
  15. 来客推电商快报之教育产业的未来发展
  16. H3CV7交换机WEB登录设备方法
  17. K8S集群中网络通信故障常见问题的排查思路
  18. 6.2.1 字符串方法 upper()、 lower()、 isupper()和 islower()
  19. 【题解】洛谷 P1957 口算练习题
  20. 前端项目开发中碰到的坑、移动端兼容性问题

热门文章

  1. DB2常用函数:字符串函数
  2. Python 之 【markdown 模块的学习】
  3. 阿里研究院副院长:数字化是否可以买来?
  4. P8U8 最中听的话,不要做每件事都考虑太多。
  5. 我们很需要“企业即时通讯”
  6. 用VC写Assembly代码(5) --函数调用(一)
  7. 很巧妙的进程防杀方法[秋镇菜原创]
  8. JPG,动态GIF,BMP一些常用解决办法
  9. 一种巧妙的删除程序自己的方法
  10. 面向对象技术第一讲 多态性