当前位置: 首页 > news >正文

Python实用笔记 (15)函数式编程——装饰器

什么函数可以被称为闭包函数呢?主要是满足两点:函数内部定义的函数;引用了外部变量但非全局变量。

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)

装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰后函数的名字;内层函数(闭包)负责修饰被修饰函数。从上面这段描述中我们需要记住装饰器的几点属性,以便后面能更好的理解:

    实质: 是一个函数

    参数:是你要装饰的函数名(并非函数调用

 

    返回:是装饰完的函数名(也非函数调用

 

    作用:为已经存在的对象添加额外的功能

 

    特点:不需要对对象做任何的代码上的变动

python装饰器有很多经典的应用场景,比如:插入日志、性能测试、事务处理、权限校验等。装饰器是解决这类问题的绝佳设计。并且从引入中的列子中我们也可以归纳出:装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑

函数装饰器

为函数添加计时功能为例,讲述函数装饰器。

复制代码
import time

def decorator(func):
    def wrapper(*args, **kwargs): start_time = time.time() func() end_time = time.time() print(end_time - start_time) return wrapper @decorator def func(): time.sleep(0.8) func() # 函数调用
# 输出:0.800644397735595
复制代码

 

在上面代码中 func是我要装饰器的函数,我想用装饰器显示func函数运行的时间。@decorator这个语法相当于 执行 func = decorator(func),为func函数装饰并返回。在来看一下我们的装饰器函数 - decorator,该函数的传入参数是func (被装饰函数),返回参数是内层函数。这里的内层函数-wrapper,其实就相当于闭包函数,它起到装饰给定函数的作用,wrapper参数为*args, **kwargs。*args表示的参数以列表的形式传入;**kwargs表示的参数以字典的形式传入:

凡是以key=value形式的参数均存在kwargs中,剩下的所有参数都以列表的形式存于args中。这里要注意的是:为了不破坏原函数的逻辑,我们要保证内层函数wrapper和被装饰函数func的传入参数和返回值类型必须保持一致。

 

转载于:https://www.cnblogs.com/niulang/p/9007630.html

相关文章:

  • LuoguP3621 [APIO2007]风铃
  • Python变量和基本数据类型
  • Transaction rolled back because it has been marked as rollback-only
  • 微信网页版的onclick事件不起作用
  • 记录MongoDB常用查询
  • Linux环境下mysql的root密码忘记解决方法(2种)
  • Oracle入门《Oracle介绍》第一章1-3 Oracle 逻辑组件
  • Vue2.0 的漫长学习ing-3-4
  • SDN学习笔记mininet+ryu开篇
  • C语言小游戏系列—恶搞关机软件,加强版
  • 第三次团队作业
  • 静态属性
  • python常用模块之json、pickle模块
  • 100baseT、100baseFX、1000base-SX、100/1000base-T
  • 【性能测试】脚本开发,最普通的http协议脚本
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Android组件 - 收藏集 - 掘金
  • CentOS从零开始部署Nodejs项目
  • C学习-枚举(九)
  • Docker 笔记(2):Dockerfile
  • es6
  • JavaScript设计模式与开发实践系列之策略模式
  • Js基础知识(一) - 变量
  • linux学习笔记
  • Markdown 语法简单说明
  • MySQL的数据类型
  • tensorflow学习笔记3——MNIST应用篇
  • 阿里云前端周刊 - 第 26 期
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 如何利用MongoDB打造TOP榜小程序
  • 线上 python http server profile 实践
  • 小李飞刀:SQL题目刷起来!
  • 阿里云ACE认证学习知识点梳理
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​queue --- 一个同步的队列类​
  • #define用法
  • (1)SpringCloud 整合Python
  • (2.2w字)前端单元测试之Jest详解篇
  • (39)STM32——FLASH闪存
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (多级缓存)缓存同步
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计大学生兼职系统
  • (三)终结任务
  • (转) 深度模型优化性能 调参
  • (转)一些感悟
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • @取消转义
  • [Android]使用Android打包Unity工程