python装饰器

预备知识

首先我们要知道在python,一切皆对象,函数也是一个对象

>>> def test():

... return "Hello World"

有自己的id值,有type,有自己的值

>>> id(test)

140155005410568

>>> type(test)

>>> test

甚至可以赋值给其他变量

>>> test1 = test

>>> test1()

'Hello World'

哪怕是当做参数传递给别的函数,也可以当做函数的返回值

>>> def foo(func):

... print(func)

... return func

...

>>> test2 = foo(test)

>>> test2()

'Hello World'

装饰器定义

装饰器本质其实就是一个函数, 可以让其它函数不改动源代码的情况下增加其他新功能, 比如网站经常需要的权限校验等场景

最初的函数

def add(x, y):

print(x+y)

add(1,2)

现在我们有一个新需求, 计算代码执行时间

import time

def add(x, y):

start_time = time.time

print(x+y)

stop_time = time.time

print("{func} spend {time} ".format(func = "add", time = stop_time-start_time))

add(1,2)

我们当然可以这么写, 但是一来修改了源代码可能会造成一些未知的错误, 二来如果我们有一百个函数, 这样写也不现实, 这就是我们装饰器出场的时候了.

创建一个装饰器

import time

def timmer(func):

"""

:param func: 被装饰的函数

:return: 一个计算函数运行时间的函数

"""

def wrapper(*args, **kwargs):

"""

:param args:收集被装饰函数的参数

:param kwargs:收集被装饰函数的关键字参数

:return:

"""

start_time = time.time()

# 让进程睡一秒

time.sleep(1)

# 调用被装饰的函数

result = func(*args, **kwargs)

stop_time = time.time()

print("{func} spend {time} ".format(func = "add", time = stop_time-start_time))

return result

return wrapper

使用装饰器

def add(x, y):

print(x,y)

# 因为timmer返回的是wrapper函数对象,所以执行add()相当于执行wrapper()

add = timmer(add)

add(1,2)

如果觉得还是麻烦那就通过一个语法糖@符号来使用装饰器

@timmer

def add(x, y):

print(x,y)

add(1,2)

这就是最基本的装饰器, 在不修改源代码的前提下为函数添加一个新功能, 调用时只需要在原函数上方添加一个 @deco_name , 在这里是@timmer

带参数的装饰器

python还允许我们给装饰器带上函数

import time

def timmer(flag):

"""

:param flag: 接收装饰器的参数

:return:

"""

def outer_wrapper(func):

"""

:param func: 接收被装饰的函数

:return:

"""

# 接收被装饰函数的参数

def wrapper(*args, **kwargs):

"""

:param args: 收集被装饰函数的参数

:param kwargs: 收集被装饰函数的关键字参数

:return:

"""

if flag == "true":

start_time = time.time()

# 调用被装饰的函数

result = func(*args, **kwargs)

# 让进程睡一秒

time.sleep(1)

stop_time = time.time()

print("{func} spend {time} ".format(func="add", time=stop_time - start_time))

return result

else:

print("Unexpected ending")

return wrapper

return outer_wrapper

通过一个语法糖@符号来使用装饰器

所谓的语法糖便是你不使用也可以完成任务,但是使用它可以让你的代码更简洁

@timmer(flag="false")

def add(x, y):

print(x, y)

add(1,2)

被多个装饰器装饰

当函数被多个装饰器装饰时,从里向外装饰

@a

@b

@c

def func():

pass

相当于

func = a(b(c(func)))

python三层装饰器-python3装饰器相关推荐

  1. python三层装饰器-python三大神器===》装饰器

    1.认识装饰器 如果你经常看我的博客,你已经学会了python的前两大"神器'(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内 ...

  2. python三层装饰器-Python自动化开发学习4-装饰器

    装饰器 通过装饰器可以为函数添加附加功能.通过修改函数本身也可以实现增加功能,但是通过装饰器还有下面2个好处.装饰器的2个原则:不改变被装饰函数的源代码 不改变被装饰函数的调用方式 遵循了上面2个原则 ...

  3. 装饰器python3菜鸟教程_认识Python装饰器

    Python中的装饰器用来给Python中的函数添加一些辅助功能.比如我们可以把[输出日志]这个辅助功能写到一个装饰器里.只要我们在某个函数A之前添加了这个[输出日志]的装饰器,那么执行函数A的时候, ...

  4. python教程:类的装饰器方法、特殊成员方法

    装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 1.静态方法 在方法名前加上@staticmethod装饰 ...

  5. python重写和装饰器_python装饰器

    python装饰器的本质,就是闭包! 我们一般谈Python的闭包,都是指普通的入参,而谈装饰器的时候,入参一定有函数!闭包和装饰器,返回的都是函数.函数是代码的最小封装单位,装饰器作用于函数,它不影 ...

  6. Python 闭包、单个装饰器、多个装饰器、装饰器修饰类、应用场景

    1. 闭包 在 Python 中,函数也可以作为参数.我们可以执行下面的代码: def func(a, b):return a + bprint(func) 我们直接输出函数名,而没有加括号.输出结果 ...

  7. Python的神奇功能——函数装饰器MetaClass

    Python中的装饰器,会让很多人望而却步.不要被它吓跑,啃下它,其实超有用,也没有想象中难. 所谓的装饰器,其实就是通过装饰器函数,来修改原函数的一些功能,使得原函数不需要修改. Python的装饰 ...

  8. python描述器做权限控制_Python装饰器14-描述器

    描述器 这是Python一个重要的概念,英文名:Descriptor descriptor是对象的一个属性,只不过它存在于类的dict中并且有特殊方法get(可能还有set和__delete)而具有一 ...

  9. Python 进阶_闭包 amp; 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

最新文章

  1. idea 关于spring boot实现自动编译
  2. Cannot connect to the Docker daemon. Is the docker daemon running on this host?
  3. BZOJ 1014 火星人prefix
  4. Node.js Electron的扩展模块
  5. 济南市软件测试工程师的工资水平,软件测试工程师工资怎么样?高吗?
  6. 常用公有云接入——亚马逊
  7. 获取客户端ip_代理IP工具能否解决反爬?
  8. zabbix 安装_安装zabbix
  9. Scrapy+eChart自动爬取生成网络安全词云
  10. 更适合Pythoner的标记语言Yaml学习总结
  11. ss命令,显示socket状态
  12. 【密码学05】加密模式
  13. CodeForces - 837F(二分组合思维)
  14. STM32——电容触摸按键实验
  15. 无需密码自己卸载深信服EDR软件
  16. 对话现实版“谢耳朵”:多重宇宙和引力、超弦理论、暗能量
  17. Java语言基础03-标识符、关键字、字面值、变量、数据类型
  18. Excel怎么设置每页都打印标题行?
  19. Android开发学习总结(一)——搭建最新版本的Android开发环境
  20. 下载的caj论文怎么转换成pdf?

热门文章

  1. vmare安装ghostwin7
  2. getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
  3. [转]Erwin4.1.4与PowerDesign9.5
  4. 有关sql server 2000的数据类型
  5. 多波次导弹发射中的规划问题(一) 网络图绘制及数据整理
  6. ItChat与图灵机器人的结合
  7. 修改jar中的class文件
  8. 上传头像,layui上传图片
  9. 数据库SQL的分组函数
  10. char[]数组与char *指针的区别