1.认识装饰器

如果你经常看我的博客,你已经学会了python的前两大‘神器’(迭代器,生成器),那么什么是装饰器呢?就如字面意义装饰器是对某个事物(通常指函数)进行装饰,让其在不修改任何内部代码的情况下增添新的功能,接下来我将一步步的解析python的装饰器。

2.闭包

在解析装饰器之前我们需要先了解下闭包的概念,我们先通过一段代码了解闭包# 定义一个函数def test(number): # 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包def test_in(number_in):print("in test_in 函数, number_in is %d" % number_in)return number+number_in# 其实这里返回的就是闭包的结果return test_in  # 给test函数赋值,这个20就是给参数numberret= test(20) # 注意这里的100其实给参数number_inprint(ret(100)) #注 意这里的200其实给参数number_inprint(ret(200))

运行结果in test_in 函数, number_inis 100120 in test_in 函数, number_inis 200220

看完这段代码我们不妨总结下闭包的作用:

1.函数名只是函数代码空间的引用,当函数名赋值给一个对象的时候 就是引用传递

2.闭包就是一个嵌套定义的函数,在外层运行时才开始内层函数的定义,然后将内部函数的引用传递函数外的对象

3.内部函数和使用的外部函数提供的变量构成的整体称为闭包

3.初识装饰器

为什么在解释装饰器时要先了解闭包的概念呢?看完下面的代码你也会就会明白def decorate(func):def inner(): return ""+func()+"" return inner @decoratedef func():return "你好" print(func())

运行结果1你好

我们可以看出装饰器就是在闭包的基础上做了一些修改。

4.装饰器普通传参from time import ctime, sleep

def timefun(func):

def wrapped_func(a, b):

print("%s called at %s" % (func.__name__, ctime()))

print(a, b)

func(a, b)

return wrapped_func

@timefun

def foo(a, b):

print(a+b)

foo(3,5)

sleep(2)

foo(2,4)

运行结果foo called at Thu Aug23 21:30:21 20183 58foo called at Thu Aug23 21:30:23 20182 46

5.装饰器不定长传参from timeimport ctime, sleep def timefun(func):def wrapped_func(*args,**kwargs):print("%s called at %s"%(func.__name__, ctime()))func(*args,**kwargs)return wrapped_func @timefundef foo(a, b, c):print(a+b+c) foo(1,2,3)sleep(1)foo(4,5,6)

运行结果foo called at Thu Aug23 21:32:50 20186foo called at Thu Aug23 21:32:51 201815

其实这里只是运用了python函数传参时的不定长传参的概念

6.装饰器中的returnfrom timeimport ctime, sleep def timefun(func):def wrapped_func():print("%s called at %s" % (func.__name__, ctime()))func()return wrapped_func @timefundef foo():print("I am foo") @timefundef getInfo():return '----hahah---' foo()sleep(2)foo() print(getInfo())

运行结果foo called at Thu Aug23 21:36:22 2018I am foofoo called at Thu Aug23 21:36:24 2018I am foogetInfo called at Thu Aug23 21:36:24 2018None

7.装饰器工厂(flask定义一个路由的方式)from timeimport ctime, sleep def timefun_arg(pre="hello"):def timefun(func):def wrapped_func():print("%s called at %s %s" % (func.__name__, ctime(), pre))return func()return wrapped_funcreturn timefun  @timefun_arg("php")def foo():print("I am foo") @timefun_arg("python")def too():print("I am too") foo()sleep(2)foo() too()sleep(2)too()

运行结果foo called at Thu Aug23 21:40:34 2018 phpI am foofoo called at Thu Aug23 21:40:36 2018 phpI am footoo called at Thu Aug23 21:40:36 2018 pythonI am tootoo called at Thu Aug23 21:40:38 2018 pythonI am too

我们分析下装饰器工厂装饰过程

1. 调用timefun_arg("itcast")

2. 将步骤1得到的返回值,即time_fun返回, 然后time_fun(foo)

3. 将time_fun(foo)的结果返回,即wrapped_func

4. 让foo = wrapped_fun,即foo现在指向wrapped_func

8.类装饰器class Test(object):def __init__(self, func):print("初始化中....")print("func name is %s"%func.__name__)self.__func= funcdef __call__(self):print("装饰中......")self.__func() @Testdef test():print("----test---")test()

运行结果初始化中....func nameis test装饰中......----test---

我们也许会发现装饰器中有个很特别的方法__call__(),这个方法时python内置的魔法方法,它作用就是让类能够向函数一样直接被调用,接下来我会专门更新一篇python中的魔法方法,如果想要了解的朋友可以关注我

总结

1.装饰器函数只有一个参数就是被装饰的函数的应用

2.装饰器能够将一个函数的功能在不修改代码的情况下进行扩展

3.在函数定义的上方@装饰器函数名 即可直接使用装饰器对下面的函数进行装饰。

原文出处:https://www.cnblogs.com/xuchuankun/p/9526487.html

什么是装饰器 python_python三大神器===》装饰器相关推荐

  1. python三大神器装饰器_Python2.x

    1)自动化 2)python编写的 openstack jumpserver ansible SaltStack yuanj zabbix json docker yaml 2)The Zen of ...

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

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

  3. python三大神器装饰器_Python3 - 复习(update to Day6)

    # 第一优先级规则声明: # 除了梦境,每一个意识主进程都必须与一个身体参与的机械进程相匹配,否则结束意识主进程.如学习python同时必须伴有记笔记.敲代码等机械进程,学习英语必须伴有朗读.听说.查 ...

  4. Python三大神器(迭代器、生成器、装饰器)和csv文件操作

    三大神器和csv文件操作 迭代器 1.什么是迭代器(iter) 迭代器是容器型数据类型 特点: 无法通过打印迭代器查看元素.也无法统计元素个数 需要使用元素的时候必须将元素从迭代器中取出,取出以后该元 ...

  5. python三大神器之装饰器

    装饰器的形成过程 假如你要写一个计算函数执行时间的函数,代码如下: 1 import time 2 3 def func1(): 4 print('in func1') 5 6 def timer(f ...

  6. python生成器和装饰器_python三大法器:生成器、装饰器、迭代器

    迭代器 迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表.元组.字典.集合.range.字符串 判断 ...

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

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

  8. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  9. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

最新文章

  1. 【计算机网络】—— 停止-等待协议
  2. Shell脚本基本规则
  3. python app mysql_Python 操作 MySQL 的5种方式
  4. vue报错Invalid Host header
  5. 3.7.4 - Indexing and Slicing Strings
  6. java.lang.OutOfMemoryError: PermGen space---先测试
  7. Nacos教程_1 简介和安装
  8. 将linux系统分区变成逻辑卷,linux运维基础知识-系统分区及LVM逻辑卷的创建
  9. django 22、python3.4环境下新建django应用失败报错计算机中丢失python27.dll的解决方法
  10. 最全原理图元器件查询
  11. 化学公式编辑器如何给图形着色
  12. android应用的关闭自动更新,软件自动更新怎么关闭 安卓关闭软件自动更新
  13. 循环冗余校验码中冗余码的计算
  14. 计算机一级用写在简历里面吗,写简历要小心,简历填写最忌讳的是什么,你知道吗?...
  15. 证券投资基金基础知识
  16. JT/T 808-2019、JT/T 809-2019文档分享
  17. 类似vmlogin浏览器的有哪些?vmlogin,AdsPower,候鸟浏览器等防关联浏览器中同类型软件最强是哪一个?防关联指纹浏览器哪个好?
  18. [leetcode每日一题2021/5/8]1723. 完成所有工作的最短时间
  19. java怎样断开http请求_http post请求管道断开
  20. 禁止视频网站使用Flash P2P上传

热门文章

  1. (二)Druid数据库连接池如何获取Connection原理和源码分析?
  2. Android开发 之 直播视频技术探究之---基础知识大纲介绍
  3. 世界最迷人的白色海岸线
  4. 5年内的暴风骤雨:12诱因统领软件行业大革命【转载】
  5. 嘉宾专访|2020 PostgreSQL亚洲大会阿里云数据库专场:曾文旌
  6. 架构和框架(Framework)的区别
  7. ES限流导致ES数据更新不及时问题
  8. hook函数教程(一)什么是钩子
  9. 【Vegas2010】1月24日-钢琴教材从零起步的进阶选取
  10. 基础算法(三):双指针/位运算/离散化/区间合并