前言

  1. 什么是装饰器

  2. 实现原理

  3. 实现效果

  4. 适用场景

装饰器:

  1. 装饰器的写法

  2. 装饰器的拓展

  3. 装饰器的模板


  • 什么是装饰器呢?

就是在特定条件下为某些函数再不改动函数体的时候为函数新添加一些功能,这就是装饰器

  • 实现原理:

基于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内置函数),执行函数时再在内层函数中执行闭包中的原函数

  • 实现效果:

可以在你改变函数内部代码和调用的前提下,实现在函数执行和执行拓展功能

  • 适用场景:

多个函数系统统一在执行前后定义一些功能

关于前言我们了解这么多就够了,然后小编带着大家推导出装饰器


装饰器:

  • 装饰器的写法:

这里我们有一个需求,我们定义了5个函数,想在5个函数执行前和执行后都打印一句话:装饰器的学习。首先我们来写于一下没有装饰器的写法,话不多说直接上代码:

def a():passdef b():passdef c():passdef d():passdef e():pass

先定义5个函数,再加上我们要打印的话:

def a():print("装饰器的学习")print("装饰器的学习")def b():print("装饰器的学习")print("装饰器的学习")def c():print("装饰器的学习")print("装饰器的学习")def d():print("装饰器的学习")print("装饰器的学习")def e():print("装饰器的学习")passprint("装饰器的学习")a()
b()
c()
d()
e()

运行一下:

发现运行成功,但我们想如果我要修改打印的话就要都修改一次,特别麻烦,而且,这是5个函数如果是500个,我们还要一个一个的去加吗?这就有我们的装饰器了,首先我用装饰器修改下,再给大家解释。

def outer(origin):def inner():print("装饰器的学习")res = origin()print("装饰器的学习")return resreturn inner@outer
def a():pass@outer
def b():pass@outer
def c():pass@outer
def d():pass@outer
def e():passa()
b()
c()
d()
e()

运行一下:

发现这样我们也成功了,接下来小编来个大家解释

  • 首先:

我们要明白@的作用,那我们的函数a来举例子@的作用就是帮我们执行一次a=outer(a),首先python将把我们的a变成参数传给outer函数,运行后再赋值给a,这就是@的作用。

  • 其次给大家解释一下自定的outer函数

我自己称这个函数为@下函数的补丁函数,也就是装饰器函数还是拿a函数举例子,首先a函数变成参数传给了我们的outer函数,outer里又嵌套了一个inner函数 ,然后将函数a赋值给res,然后用return语句返回出结果,外层函数返回inner函数,也就是将inner函数运行一次,这就是工作流程。

  • 最后分别在各函数前加上装饰,最后运行出结果

这就是装饰器的写法。

  • 装饰器的参数

这时我遇到一个问题如果函数内有参数而且每个函数的参数数量不同,我们应该怎末办,先看下面代码

def outer(origin):def inner():print("装饰器的学习")res = origin()print("装饰器的学习")return resreturn inner@outer
def a(g, e):pass@outer
def b(w):pass@outer
def c(u, y, t):pass@outer
def d(c):pass@outer
def e():passa()
b()
c()
d()
e()

这时我们运行一下

发现报错,是因为我们的装饰器内没有这两个参数,那可以在装饰器内设置两个参数,但问题是,有的函数内有3个参数,而有的函数内没有参数,那我们应该怎么办?

针对这个问题我们可以给装饰器设置动态参数,先看代码:

def outer(origin):def inner(*args, **kwargs):print("装饰器的学习")res = origin(*args, **kwargs)print("装饰器的学习")return resreturn inner@outer
def a(a1):print("我是一函数")@outer
def b(a1, a2):print("我是二函数")@outer
def c(a5, a6, a7):print("我是三函数")a(1)
b(2, 3)
c(4, 5, 6)

因为函数太多了,小编有点麻烦就剪了几个函数,但道理是相同的,这时我们再运行一下

这样我们就成功了,以上就是装饰器的写法,接下来给大家拓展一下


  • 装饰器的拓展:(functools模块)

首先给大家引入一下这时教给大家几个魔法方法

.__name__ 获取函数名字
.__doc__ 获取函数内的注释

接下来我们实战一下

def outer(origin):def inner(*args, **kwargs):# 我是一个装饰器函数print("装饰器的学习")res = origin(*args, **kwargs)print("装饰器的学习")return resreturn inner@outer
def c(a5, a6, a7):# 我是个函数print("我是三函数")c(4, 5, 6)
print(c.__name__)
print(c.__doc__)

运行一下:

这时我们发现我要的是c函数,但给我反馈的是inner函数,这是为什么呢?

这就是工作原理,直接就把c函数装饰成了inner函数,那以后再工作中一定会要自己函数的名字,而不要我装饰后的函数,这样就可以让我们的函数装饰的更像,其实在以后中,都想装饰的更像,那我们应该怎末办?

这时就需要我们的第三方模块functools,直接上代码

import functoolsdef outer(origin):@functools.wraps(origin)def inner(*args, **kwargs):# 我是一个装饰器函数print("装饰器的学习")res = origin(*args, **kwargs)print("装饰器的学习")return resreturn inner@outer
def c(a5, a6, a7):# 我是个函数print("我是三函数")c(4, 5, 6)
print(c.__name__)
print(c.__doc__)

这时再运行一下

这时我们发现,我们伪装成功了,这样就会让我们的装饰更像。


  • 装饰器模板:

接下来送给大家装饰器的模板,以后需要随时ctrl+c和ctrl+v

import functoolsdef outer(origin):@functools.wraps(origin)def inner(*args, **kwargs):# 这里书写需要装饰的功能res = origin(*args, **kwargs)return resreturn inner

记得要在需要装饰的函数前要写上@outer哦

总结:

综上,就是关于装饰器的所有知识点,希望大家能学到,最后希望大家多提宝贵意见,我们下期见。

python装饰器这一篇就够了相关推荐

  1. 由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

    上一篇:由浅入深,走进Python装饰器-----第四篇:进阶--函数装饰类 类装饰器 @类 类 4.1 用类装饰器来扩展原类( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发_ ...

  2. python装饰器由浅入深_由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

    **类装饰器** @类 类 4.1 用类装饰器来扩展原函数( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): de ...

  3. python装饰器-python装饰器简介---这一篇也许就够了(推荐)

    Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器引入 初期及问题诞生 假如现在在一个公司,有A B C三个业务部门,还有S一个基 ...

  4. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  5. python装饰器传参与不传参_Python装饰器不会传参?别着急,这篇文章为你解惑

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第13篇文章,上一篇文章当中我们介绍了Python装饰器的定义和基本的用法,这篇文章我们一起来学习一下Python装 ...

  6. python装饰器函数-Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

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

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

  8. 简单介绍python装饰器

    这篇文章简单介绍一下python装饰器,希望对你们有所帮助. 简单正常python例子: def up(text):return text.upper() #转成大写 def lo(text):ret ...

  9. Python装饰器-装饰流程,执行顺序

    最近看到一个关于Flask的CTF(RealWorld CTF 2018 web题bookhub)文章 其中的一个trick是装饰器的顺序问题,就想写篇博客回顾下装饰器~ 首先强烈推荐很久之前看的一篇 ...

最新文章

  1. 汪国华 基因组分析的生物信息学算法
  2. 用buildout来构建python项目
  3. 一个小老板从小公司创业开始做起的过程记录
  4. rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列
  5. Python yaml处理
  6. {ubuntu}不能挂载windows
  7. 获取本地IP和端口号的指令
  8. Odoo 强大的开源微信模块 oejia_wx
  9. glassfish mysql datasource_GlassFish连接池(GlassFish connection pool)
  10. 【读书笔记】《洛克菲勒写给儿子的38封信》
  11. 网站443端口经常受到攻击怎么办
  12. 公开招聘网上报名系统+系统功能介绍—网上报名登陆入口
  13. 小飞鱼通达二开 通过开发工作流接口集成ERP系统(图文)
  14. 揭秘组件库一二事(上)
  15. Android 学习网址大全
  16. Linux各版本内核下载地址
  17. MYSQL操作+C语言API
  18. JQuery - 反向选择器
  19. 如何获取浏览器的user-agent
  20. 俄罗斯钓鱼四服务器未响应,俄罗斯钓鱼4《RussianFishing4》sbirolino钓组攻略

热门文章

  1. 《你一定爱读的极简欧洲史》
  2. 命令行cmd如何切换目录
  3. Greenplum6.x搭建_安装
  4. 服务器如何修改3389端口,怎么修改服务器3389端口
  5. Ubuntu20.04 ROS读取basler相机图像步骤。MATLAB2021b标定basler单目相机
  6. MySql 8.0.19安装
  7. 和时间做朋友,在Mate40发布会现场感知“华为精神”
  8. Weisfeiler-Lehman(WL)算法
  9. unity材质球发光_unity自发光材质
  10. 浅谈 TS 标称类型介绍及社区实现