1. 装饰器的定义

就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数

装饰器的功能特点:

  1. 不修改已有函数的源代码
  2. 不修改已有函数的调用方式
  3. 给已有函数增加额外的功能

2. 装饰器的示例代码

# 添加一个登录验证的功能
def check(fn):def inner():print("请先登录....")fn()return innerdef comment():print("发表评论")# 使用装饰器来装饰函数
comment = check(comment)
comment()# 装饰器的基本雏形
# def decorator(fn): # fn:目标函数.
#     def inner():
#         '''执行函数之前'''
#         fn() # 执行被装饰的函数
#         '''执行函数之后'''
#     return inner

代码说明:

  • 闭包函数有且只有一个参数,必须是函数类型,这样定义的函数才是装饰器。
  • 写代码要遵循开放封闭原则,它规定已经实现的功能代码不允许被修改,但可以被扩展。

执行结果:

3. 装饰器的语法糖写法

如果有多个函数都需要添加登录验证的功能,每次都需要编写func = check(func)这样代码对已有函数进行装饰,这种做法还是比较麻烦。

Python给提供了一个装饰函数更加简单的写法,那就是语法糖,语法糖的书写格式是: @装饰器名字,通过语法糖的方式也可以完成对已有函数的装饰

# 添加一个登录验证的功能
def check(fn):print("装饰器函数执行了")def inner():print("请先登录....")fn()return inner# 使用语法糖方式来装饰函数
@check
def comment():print("发表评论")comment()

说明:

  • @check 等价于 comment = check(comment)
  • 装饰器的执行时间是加载模块时立即执行。

执行结果:

4. 小结

  • 装饰器本质上就是一个闭包函数,它可以对已有函数进行额外的功能扩展。
  • 装饰器的语法格式:

    # 装饰器
    # def decorator(fn): # fn:被装饰的目标函数.
    #     def inner():
    #         '''执行函数之前'''
    #         fn() # 执行被装饰的目标函数
    #         '''执行函数之后'''
    #     return inner
    
  • 装饰器的语法糖用法: @装饰器名称,同样可以完成对已有函数的装饰操作。

装饰器的定义、语法糖用法及示例代码相关推荐

  1. 50 Python - 装饰器 类定义装饰器

    04 类定义装饰器 上节通过函数定义装饰器,本节通过类定义装饰器 001 定义类装饰器 定义一个类,类里面两个函数,一个构造函数init(),一个调用函数call() 构造函数init时候,传递一个函 ...

  2. python 开闭原则_Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】

    本文实例讲述了Python 装饰器@,对函数进行功能扩展操作.分享给大家供大家参考,具体如下: 装饰器可以对原函数进行功能扩展,但还不需要修改原函数的内容(开闭原则),也不需要修改原函数的调用. de ...

  3. [From 10.1~10.5] 对象和集合初始化器(C#语法糖系列)

    经常要构造一个对象并设置对象的一些公众属性(或字段). 1.为了简化这个常见的编程模式,C#语言支持一种特殊的对象初始化语法.下面是一个例子: Employee e = new Employee(){ ...

  4. 列出html表单元素及语法,HTML表单(示例代码)

    一.表单[重点] 1.什么是表单及原理? 用户将网页中的数据,提交给后台数据库进行处理. 在BS模式下,便带负责将客户端的请求发送到后台查询,后台响应的结果,显示在浏览器中. 网页中的数据,通过表单的 ...

  5. php种loop用法,PHP EvLoop 用法 手册 | 示例代码

    EvLoop::backend - Returns an integer describing the backend used by libev EvLoop::check - Creates Ev ...

  6. php里面的mark,PHP CommonMarkCQL 用法 手册 | 示例代码

    简介 CommonMark Query Language is a DSL for describing how to travel through a CommonMark Node tree im ...

  7. python装饰器的十种用法

    ''' #第一步:创建一个普通函数 def laxi():print('噗哧噗哧噗哧噗哧---')#调用函数 laxi() laxi() '''''' #第二步:扩展函数的功能(不是装饰器) #声明一 ...

  8. 人人都能看懂的 Python 装饰器入门教程

    大家好,我是萱萱! 之前的文章中提到,很多人认为理解了装饰器的概念和用法后,会觉得自己的 Python 水平有一个明显的提高. 但很多教程在一上来就会给出装饰器的定义以及基本用法,例如你一定会在很多文 ...

  9. python中的装饰器和抽象类

    装饰器和抽象类 装饰器就是对函数或者方法或者类进行修饰 ''' #第一步:创建一个普通函数 def laxi():print('噗哧噗哧噗哧噗哧---')#调用函数 laxi() laxi() ''' ...

最新文章

  1. ext2.2打造全新功能grid系列--仅仅动态生成GridPanel
  2. pcl程序如何在linux上运行,Ubuntu系统安装PCL 1.9及以上版本
  3. python笔试编程题_Python——面试编程题
  4. google浏览器 隐藏功能开启
  5. 插件 KSImageNamed 用图片时自动显示图片缩略图
  6. 全方位打造最强终端(iterm2 + oh my zsh)
  7. 50个超实用的生活小点子
  8. 密码加密模块 bcrypt (详细,好理解,示例源码)
  9. Git工具代码版本管理以及基本使用说明
  10. What?什么是区块链?你不知道就太low了
  11. poj 1679(次小生成树)
  12. Audio播放流程(三)---NuPlayer流程之setAudioStreamType以及prepare
  13. SQL中GROUP BY用法示例
  14. HTTP 应用层过滤的兼容性问题及解决方案
  15. 【OR】YALMIP 鲁棒优化
  16. 树莓派Python开发第8课: PWM实验
  17. php音视频边下边播,封装bilibili播放器,自定义边下边播和缓存功能
  18. 配置OHS 12C转发HTTPS请求
  19. idea 项目添加图片或更换图片 引用后没反应(清缓存)
  20. 计算机域名的解释,通俗易懂:域名与IP的关系讲解

热门文章

  1. 谈“云”色变?近80%企业曾遭受数据泄露
  2. 百度飞桨全新升级:重磅推出PaddleHelix平台、开源框架V2.0RC,硬件生态路线图全公开...
  3. 小团队如何玩转物联网开发?
  4. 你想见的大神都来AI ProCon 2019了,优惠票限时抢购开启!
  5. “男医生,女护士?”消除偏见,Google有大招
  6. AI 技术实力图谱全解析!2018 中国 AI 开发者大会重磅来袭
  7. 科大讯飞拟募资36亿,要搞什么大事?
  8. 李飞飞等提出新的迭代视觉推理框架,在ADE上实现8.4 %的绝对提升
  9. 老板说我最近飘了,都敢用 MySQL 实现分布式锁了
  10. 动态代理竟然如此简单!