合理使用装饰器可以简化开发,并且使得代码更加清晰。下面我们分别介绍两种装饰器,不带参数的装饰器和带参数的装饰器。

一、不带参数的装饰器

我们用一个实际的例子来引入装饰器的概念,比如我们现在有一个方法A(),然后我们需要在方法A()执行之前在终端打印"function is running",这时候我们可以在方法A()的开始部分加上下面的代码:print("function is running")

但是如果我们不想修改方法A()的代码,也可以重新写一个方法decorator(),然后把A()作为入参,代码如下:def decorator(fun):

@functools.wraps(fun)

def wrapper(*args, **kwargs):

print("Method is running")

return fun()

return wrapper

python中的方法可以作为参数传入另一个方法,所以当我们执行decorator(A)的时候,返回的是一个方法,这个方法的本质是先执行print语句,然后再执行A()。

但是这样我们的调用代码就需要进行修改,也就是说之前调用方法A(),现在的写法是调用decorator(A)(),为了不影响调用的代码,我们使用python的语法糖改造方法A()的代码。@decorator

def A():

# do something

实际上只是在A()的前面加上一行@decorator,这样在我们的调用代码就不需要改变了。

装饰器中的@functools.wraps(fun)是为了保证返回的方法__name__属性和入参方法fun的__name__属性相同。

二、带入参的装饰器

在上面不带参数的装饰器中,我们实现了在执行方法A()之前打印一行固定的字符串,如果我们想要打印不同的字符串就需要用带参数的装饰器。实际上就是在不带参数的装饰器上再封装一层即可,代码如下:def decorator_par(name):

def decorator(fun):

@functools.wraps(fun)

def wrapper(*args, **kwargs):

print("Method {} is running".format(name))

return fun()

return wrapper

return decorator

这样我们就可以在使用装饰器的时候设置参数name,实现打印不同的信息。完整的代码如下:import functools

def decorator_par(name):

def decorator(fun):

@functools.wraps(fun)

def wrapper(*args, **kwargs):

print("Method {} is running".format(name))

return fun()

return wrapper

return decorator

@decorator_par("A")

def A():

print("I am A")

@decorator_par("B")

def B():

print("I am B")

A()

B()

执行输出为:Method A is running

I am A

Method B is running

I am B

可以看到我们在不改变方法调用代码的情况下,实现了在该方法之前打印特定的信息。

以上就是装饰器的两种实现示例,实际开发中也可以将多个装饰器进行嵌套,可以实现更加复杂的需求。

python的装饰器很有用吗_你真的了解python装饰器么相关推荐

  1. 新媒体学python有用吗_你真的不学Python吗?学习Python的四大理由!

    在众多人的脑海中,Python无非就是一门编程语言而已,并没有什么特色,但是提及学习编程大部分人都会推荐Python,为什么?今天就给你说说学习Python的四大理由吧. 首先先来了解一下什么是Pyt ...

  2. python做脚本语言要了解什么_你真的了解Python吗?本文可以让你对Python了解更深入...

    人们为什么使用Python? 之所以选择Python的主要因素有以下几个方面:软件质量:在很大程度上,Python更注重可读性.一致性和软件质量,从而与脚本语言世界中的其他工具区别开发.此外,Pyth ...

  3. python对非it上班族有用吗_非专业人士学Python有用吗?

    当然有用啦!!! 说个真实的故事 有个朋友,曾经在某国内零售民企工作,做的是销售管理,也就是运营岗位,每天的工作就是用Excel做下销售数据,跟进线下销售情况,工作中最有技术含量不过于用个vlooku ...

  4. python使用复合语句def创建函数对象_【收藏】Python实用技巧-成为Pythoner必经之路...

    前言 本文主要记录 Python 中一些常用技巧,所描述的是告诉你怎么写才是更好?  如果你并不熟悉Python语法,希望你能在下面代码片段中看到Python的简单.优雅; 如果你象我这样,对 Pyt ...

  5. 老男孩python全栈9期全套视频_[全套视频] 老男孩Python全栈7期:Flask全套组件及原理剖析视频教程,全套视频教程学习资料通过百度云网盘下载...

    目录├─1398 T* * I K, E% T│ ├─01 python fullstack s7day139 课前分享之找一个对标的人.mp4│ ├─02 python fullstack s7da ...

  6. python中意外缩进是什么意思_语法错误 - 如何处理python中的“意外缩进”?

    语法错误 - 如何处理python中的"意外缩进"? 如何纠正python中的"意外缩进"错误? 15个解决方案 116 votes Python在行的开头使用 ...

  7. python语言有几种编程方式_零基础自学python语言,有哪几种方法?龟叔说:这套教程带你入门...

    第一我要说的是:你应该先了解python语言的起源,这句话对于自学python的小白来说,本身就是耍流氓. 我们从根源上分析这个问题,这个问题是(从零基础如何自学python编程)? 我的提取关键字: ...

  8. python适用场景_你真的了解Python吗?什么场景使用多线程,什么场景使用多进程?...

    引言 涉及并发的场景,大家想到使用多线程或多进程解决并发问题; 一般情况下,解决多并发场景问题,多数语言采用多线程编程模式(线程是轻量级的进程,共用一份进程空间). 也同样适用于Python多并发处理 ...

  9. 学python还是不会编程_你真的不学Python吗?学习Python的四大理由!

    在众多人的脑海中,Python无非就是一门编程语言而已,并没有什么特色,但是提及学习编程大部分人都会推荐Python,为什么?今天就给你说说学习Python的四大理由吧. 首先先来了解一下什么是Pyt ...

最新文章

  1. linux mysql远程连接其他服务器_Linux服务器中MySQL远程连接的开启方法
  2. jdk安装教程_使用JDK 8流在包装对象的集合和包装对象的集合之间转换
  3. 如何在C++中调用python程序?
  4. 【VMCloud云平台】SCAP(一)规划
  5. TensorFlow HOWTO 4.1 多层感知机(分类)
  6. python中的pickle解析
  7. 干货|别找了,分享80个无版权、高清、免费图片素材网站给你!
  8. 【电子产品】Fast FWR200 公司使用设备人数超过20个后,之后的设备无法上网
  9. 医咖会SPSS免费教程学习笔记—Fisher精确检验
  10. 大数据自助分析平台系列文章(深入讲解由零开始设计一个大数据自助分析平台)
  11. 篮球赛日程表_横县校椅青桐2019春节篮球赛火热开赛!快收好赛程表!
  12. 四步骤搞定专属PE系统【xitongshoucang.com】
  13. 【BZOJ 1006】 [HNOI2008]神奇的国度
  14. Z(zombie)僵尸进程和孤儿进程
  15. (CVE-2020-11800)Zabbix_Server_trapper_命令注入漏洞
  16. 图像增广 || 通过仿射变换实现图像的平移、缩放、旋转、翻转、错切,及MATLAB实现与分析
  17. DDR中bank,die,rank,channel的概念
  18. ajax提交多个form表单
  19. javascript 实现生成GUID / UUID的多种方法
  20. 【elasticsearch】elasticsearch教程 es整合springboot教程 kibana安装教程 解决kibana访问404

热门文章

  1. Linux日志管理五大命令详解
  2. JavaEye站长对OpenSocial与Facebook平台的比较
  3. 惠普 Compaq Presario V3704TX改XP实战手记
  4. Centos5上安装JRE和LUMAQQ
  5. CListCtrl 使用方法总结
  6. Activiti 用户任务并行动态多实例(多用户执行流程)
  7. 【BZOJ1060】[ZJOI2007] 时态同步(树形DP)
  8. PE文件格式学习之PE头移位
  9. C#里如何遍历枚举所有的项
  10. 每天学一点flash(56)循环的小实验