更详细的装饰器,真心实力推荐,里面介绍的很清楚,介绍可见链接:https://blog.csdn.net/buster_zr/article/details/81104551

1、装饰器的理论:

  (1)装饰器实际上就是一个函数

  (2)有2个特别之处,参数是一个函数。返回值是一个参数

2、装饰器的简单理解

  实际上就是为了给一个程序添加功能,但是该程序已经上线或者已被使用,那么就不能大批量的修改源码,这样不现实,因此就产生了装饰器。

  注意点:

    (1)不能修改被装饰的函数的源代码

    (2)不能修改被装饰的函数的调用方式

3、装饰器的组成方式:

  函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器

  有关高阶函数的理解:

    (1)把一个函数名当作实参传给另外一个函数(”实参高阶函数“)

    (2)返回值中包含函数名(”返回值高阶函数“)

  嵌套函数的理解:

     嵌套函数指的是在函数内部定义一个函数,而不是调用。

  语法糖:

      写法:@xx  ,一般写在函数的上方

4、真正装饰器的开始之处:

  装饰器在装饰时,需要在每个函数前面加上@xxx

(1) 装饰无参函数,示例代码如下:

#装饰器装饰的函数无参数
def timer(func): #func其实指的就是test
def deco():
start = time.time()
func() #这里其实是对test的调用
stop = time.time()
print (stop-start)
return deco @timer #test函数使用装饰器
def test():
time.sleep()
print ("test is running")
test() 打印结果:
test is running
2.003510952

(2)装饰有参函数,示例代码如下:

#装饰器装饰的函数有参数
def timer(func):
def deco(*args,**kwargs): #添加可变参数*args和**kwargs
start = time.time()
func(*args,**kwargs) #这里也是一样,添加可变参数*args和**kwargs
stop = time.time()
print (stop-start)
return deco @timer
def test(value): #test函数有个参数value,正因为装饰器timer装饰的函数test有参数value,因此在timer中的有了可变参数
time.sleep()
print ("test is running %s" %value)
test("") 打印结果:
test is running
2.00424408913

3、带参数的装饰器,示例代码如下:

#装饰器带参数
def timer(parameter):
def out_wapper(func):
def wapper(*wargs,**kwargs):
if parameter == "task1":
start = time.time()
func(*wargs,**kwargs)
stop = time.time()
print ("the task1 is run:",stop-start)
elif parameter == "task2":
func(*wargs, **kwargs)
print ("the task2 is run:")
return wapper
return out_wapper @timer(parameter = "task1")
def task1():
time.sleep()
print "in the task1" @timer(parameter = "task2")
def task2():
time.sleep()
print "in the task2" task1()
task2() 打印结果:

in the task1
('the task1 is run:', 2.002906084060669)
in the task2
the task2 is run:

python----装饰器(几种常见方式的使用与理解)的更多相关文章

  1. python装饰器三种装饰模式的简单理解

    学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了! 这里就简单讨论下python的几种装饰模式: 一 无参装饰器: # 装饰器 import time ...

  2. python 装饰器问题及解决方式

    #统计函数运行时间 import time #装饰器 def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() fun ...

  3. python装饰器执行顺序

    . python 装饰器 1) 2层装饰器 def decorator(func): # TODO def wrapper(*args, **kwargs): # TODO func(*args, * ...

  4. python 装饰器、递归原理、模块导入方式

    1.装饰器原理 def f1(arg): print '验证' arg() def func(): print ' #.将被调用函数封装到另外一个函数 func = f1(func) #.对原函数重新 ...

  5. Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方案

    本文为霍格沃兹测试学院学员学习笔记. Python 装饰器简介 装饰器(Decorator)是 Python 非常实用的一个语法糖功能.装饰器本质是一种返回值也是函数的函数,可以称之为“函数的函数”. ...

  6. Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  7. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  8. Python装饰器,Python闭包

    可参考:https://www.cnblogs.com/lianyingteng/p/7743876.html suqare(5)等价于power(2)(5):cube(5)等价于power(3)(5 ...

  9. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

随机推荐

  1. git 版本控制中回溯到某个历史版本

    1.git log 查看之前的版本号 2. git reset --hard 版本号 3.git push -f -u origin 分支 恢复上一个版本是: git reset --hard HEA ...

  2. 爬虫存储介质之CSV文件存储

    本文章来自度娘 CSV文件存储 CSV,全称为Comma-Separated Values,中文可以叫做逗号分隔值或字符分隔值,其文件以纯文本形式 存储表格数据.该文件是一个字符序列,可以由任意数目的 ...

  3. eclipse的maven中需要把jar的包文件登入到自己的仓库里面的操作

    问题的描述 从别人那拿到了Java maven的工程,导入自己的eclipse中之后编译的时候出现包文件找不到,之后把工程进行maven的update project之后,pom.xml文件出现错误, ...

  4. [转帖]各种命令,以及FAQ..持续更新.....

    各种命令,以及FAQ..持续更新..... https://www.cnblogs.com/jicki/p/5548668.html Linux 篇: CentOs 7 修改主机名 hostnamec ...

  5. [VS] - EntityFrameworkCore 2.0 安装失败 之解决

    背景 在 Visual Studio 2017 中,使用 Nuget 包管理器安装 EntityFrameworkCore 2.0 失败.切换至程序包控制器管理台,查看 Error Message: ...

  6. Windows10下Anaconda+Tensorflow+Keras环境配置

    注意!注意!!注意!!! (重要的事情说三遍) 安装前检查: 1.Tensorflow不支持Anaconda2,Tensorflow也不支持python2.7和python3.7(满满的辛酸泪!) 2 ...

  7. Oracle部分

    做了很多年Oracle,转行到MySQL了,算是借鉴 Oracle日常维护管理指标 一. 基本硬件环境 1. 主机硬件环境 品牌 型号 数量 物理CPU核数及逻辑CPU数 内存大小 本地硬盘大小 光驱 ...

  8. 基于thymeleaf实现简单登录

    1.引入thymeleaf.静态资源等依赖 <dependency> <groupId>org.springframework.boot</groupId> < ...

  9. Markdown试试

    from os import time print("haha") from os import time print("haha") time.time()! ...

  10. 你不知道的 JSON.stringify() 的威力

    掘进:https://juejin.im/post/5decf09de51d45584d238319?utm_source=gold_browser_extension#heading-19 gith ...