学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器。

大家应该多多少少在其它地方有看过或是听过“装饰器”这个词。装饰器,顾名思义,就是用来装饰的,它装饰的是一个函数,保持被装饰函数的原有功能,再装饰上(添油加醋)一些其它功能,并返回带有新增功能的函数对象,所以装饰器本质上是一个返回函数对象的函数(确切的说,装饰器应该是可调用对象,除了函数,类也可以作为装饰器)。

Python的装饰器(decorator)是一个很棒的机制,也是熟练运用Python的必杀技之一。在编程过程中,我们经常遇到这样的场景:登录校验,权限校验,日志记录等,这些功能代码在各个环节都可能需要,但又十分雷同,通过装饰器来抽象、剥离这部分代码可以很好解决这类场景。

什么是装饰器?

要理解Python的装饰器,首先我们先理解一下Python的函数对象。我们知道,在Python里一切都是对象,函数也不例外,函数是第一类对象(first-class objects),它可以赋值给变量,也可以作为list的元素,还可以作为参数传递给其它函数。

函数可以被变量引用

定义一个简单的函数:def say_hi():

print('Hi!')

say_hi()# Output: Hi!

我们可以通过另外一个变量say_hi2来引用say_hi函数:say_hi2 = say_hi

print(say_hi2)# Output: say_hi2()# Output: Hi!

上面的语句中say_hi2 和 say_hi 指向了同样的函数定义,二者的执行结果也相同。

函数可以作为参数传递给其它函数def say_more(say_hi_func):

print('More')

say_hi_func()

say_more(say_hi)# Output:#     More#     Hi

在上面的例子中,我们把say_hi函数当做参数传递给say_more函数,say_hi 被变量 say_hi_func 引用。

函数可以定义在其它函数内部def say_hi():

print('Hi!')    def say_name():

print('Tom')

say_name()

say_hi()# Output:#     Hi!#     Tomsay_name() # 报错

上述代码中,我们在say_hi()函数内部定义了另外一个函数say_name()。say_name()只在say_hi函数内部可见(即,它的作用域在say_hi函数内部),在say_hi外包调用时就会出错。

函数可以返回其它函数的引用def say_hi():

print('Hi!')    def say_name():

print('Tom')    return say_name

say_name_func = say_hi()# 打印Hi!,并返回say_name函数对象# 并赋值给say_name_funcsay_name_func()# 打印 Tom

上面的例子,say_hi函数返回了其内部定义的函数say_name的引用。这样在say_hi函数外部也可以使用say_name函数了。

前面我们理解了函数,这有助于我们接下来弄明白装饰器。

装饰器(Decorator)

装饰器是可调用对象(callable objects),它用来修改函数或类。

可调用对象就是可以接受某些参数并返回某些对象的对象。Python里的函数和类都是可调用对象。

函数装饰器,就是接受函数作为参数,并对函数参数做一些包装,然后返回增加了包装的函数,即生成了一个新函数。

让我们看看下面这个例子:def decorator_func(some_func):

# define another wrapper function which modifies some_func

def wrapper_func():

print("Wrapper function started")

some_func()

print("Wrapper function ended")

return wrapper_func # Wrapper function add something to the passed function and decorator returns the wrapper function

def say_hello():

print ("Hello")

say_hello = decorator_func(say_hello)

say_hello()# Output:#  Wrapper function started#  Hello#  Wrapper function ended

上面例子中,decorator_func 就是定义的装饰器函数,它接受some_func作为参数。它定义了一个wrapper_func函数,该函数调用了some_func但也增加了一些自己的代码。

python什么是装饰器_python学习之装饰器是什么?相关推荐

  1. 如何使用python装饰器_Python学习之如何使用装饰器 @decorator

    建议大家在看这篇文章之前还是点击上面这篇文章看一下,先了解一下什么是装饰器之后再看. 猿人学python之我的学习笔记分享:如何使用装饰器 @decorator 上面代码中使用装饰器的方法看起来有点复 ...

  2. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  3. python grpc unary call错误_python的黑魔法-装饰器

    python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...

  4. python的网页解析器_python 之网页解析器

    一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...

  5. python自带网页解析器_python 之网页解析器

    一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...

  6. python游戏编程网课_Python 学习最佳方式_创建游戏_编程一个机器人

    Python 是世界上功能最多且最强大的编程语言之一.使用 Python,你可以编写自己的应用程序,创建游戏.设计算法.甚至编程一个机器人.学习 Python 还可以担任软件工程师.Web 开发人员. ...

  7. webgl着色器初学习-顶点着色器和片元着色器

    文章目录 webgl工作步骤 顶点着色器 片元着色器 案例 webgl工作步骤 每一个像素点都将执行这两个着色器 我理解为这两个着色器,顶点着色器决定渲染位置 ,片元着色器决定颜色 顶点着色器 编写一 ...

  8. python文件下载速度 装饰器_python学习笔记之---装饰器

    # -*- coding:utf-8 -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print ("myfunc() called.") ...

  9. python重写和装饰器_python中的装饰器

    装饰器的本质: 当你在用某个@decorator来修饰某个函数func时,如下所示: @decorator def func(): pass 其解释器会解释成下面这样的语句: func=decorat ...

最新文章

  1. 2021年春季学期-信号与系统-第七次作业参考答案-第十小题
  2. 安装 postgresql
  3. 【Android 插件化】现有的针对插件化恶意应用的解决方案 | 插件化应用开发推荐方案
  4. Web应用界面设计规范
  5. 使用SQL Server 2008 Extended Events SSMS Addin轻松管理XEvents
  6. c语言 char memcpy,在C中使用memcpy复制无符号字符数组
  7. erp 弹不出oracle,ORACLE ERP系统经常出现的问题及解决办法
  8. 作者:吴甘沙,男,现任英特尔中国研究院院长。
  9. Go的web工作原理
  10. 笔记05 局部类型
  11. sencha touch 类的使用
  12. 2018上IEC计算机高级语言(C)作业 第1次作业 。
  13. 可复用可扩展的红包后台系统设计方案
  14. darknet + yolo3 训练自己的数据集
  15. SPSS进行问卷数据的效度分析及结果解读(问卷数据统计分析第3步(转载)
  16. 单片机蓝桥杯——超声波测距
  17. 水壶的问题—字节跳动Android岗面试题
  18. java抽象类例子月薪年薪程序_利用抽象类给一个有工资收入和稿费收入的小伙伴算税...
  19. CentOS 7重启报错:Entering emergency mode. Exit the shell to continue...
  20. 文化传播有限公司网站源码dian

热门文章

  1. mac如何把html转成word,Mac ---- markdown 转 html\word\pdf
  2. 蓝牙4.0(BLE)电子烟方案
  3. 《ZEMAX光学设计超级学习手册》一一2.3 能量分析
  4. Fusioncharts参数
  5. 奶牛生子问题(腾讯面试题)
  6. 身上只剩一美分该怎么做呢 ?
  7. #创新实训#VR漫游项目汇报1
  8. TrimLeft()和TrimRight()
  9. 持续打造开放生态圈 华为IT发力地市级市场
  10. 使用 stable diffusion 将视频动漫化