python的装饰器如果用得好,那是大神,用的不好最好别用。。。

装饰器(decorator)主要包含俩大属性:

1、不能改变原有函数的调用方式

2、不能改变原有函数的代码

第一个表示,我不需要改变原来代码的结构

第二个表示,我也不需要改吗原有函数的代码,特别是一些核心代码

先写个简单的装饰器:

def printFuncName(func):
def wrapper():
print("Enter func " + func.__name__)
func()
return wrapper @printFuncName
def helloWorld():
print("This is first helloworld!") helloWorld()

  

如上,printFuncName是个装饰器,打印进入函数的名称,helloworld是一个简单函数

如果没有装饰器printFuncName,函数helloworld调用方式为:helloworld()

加了装饰器之后(@printFuncName),调用方式仍然为helloworld(),而且也非常简洁

其实在加了装饰器之后,原始调用方式应该是下面这样:

def printFuncName(func):
def wrapper():
print("Enter func " + func.__name__)
func()
return wrapper def helloWorld():
print("This is first helloworld!") helloWorld = printFuncName(helloWorld)
helloWorld()

而为了写得简洁,所以helloWorld = printFuncName(helloWorld)直接用@printFuncName来代替了

说到这儿必须说如果原函数带参数怎么办?

这里可以把参数写到wrapper里面,如下所示:

def printFuncName(func):
def wrapper(x):
print("Enter func " + func.__name__)
func(x)
return wrapper @printFuncName
def helloWorld(x):
print("This is first helloworld!")
print(x*2) helloWorld(3)

当然有人想到,每个函数参数并不是相同的,怎么做?

python中有可变参数*args和**kwargs,这样不管你有多少个参数都可以搞定,如下:

def printFuncName(func):
def wrapper(*args,**kwargs):
print("Enter func " + func.__name__)
func(*args)
return wrapper @printFuncName
def helloWorld(x):
print("This is first helloworld!")
print(x*2) @printFuncName
def sampleTest(x,y):
print("This is sampleTest func!")
print(x**y) helloWorld(3)
sampleTest(3,3)

是不是很简单?但实际应用中怎么去用,是很关键的,只有多用多总结才能用得好~~

python之装饰器(decorator)的更多相关文章

  1. python函数编程-装饰器decorator

    函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...

  2. python 深入浅出装饰器(decorator)--举的例子关于星级争霸2(starcraft2)

    其实早就想写一篇深入浅出装饰器的文章,苦于一直没有找到很好的例子描述,自己除了在写api参数检测和日志打印的时候用到以外,其他地方也没有什么重度使用所以一直没有写. 我不会讲解装饰器的理论,还有各种基 ...

  3. 详解python的装饰器decorator

    装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...

  4. 关于Python的装饰器 decorator

    装饰器的原理:其实就是高阶函数,接收原函数以在之前之后进行操作. 语法格式是固定的:先定义一个函数,再使用@语法调用该函数. 例子一: import functools # 定义装饰器,固定格式 de ...

  5. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...

  6. 关于python的装饰器(初解)

    在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...

  7. python 装饰器(decorator)

    装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...

  8. python语法32[装饰器decorator](转)

    一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...

  9. python 语法之 装饰器decorator

    装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...

随机推荐

  1. python 之C3算法

    C3算法只要针对的Python2.3版本之后出现的新式类MRO(method resolution order) -------继承方法查询顺序;而经典类MRO则遵循的是深度优先遍历(树形结构) (1 ...

  2. CentOS7配置samba服务

    Step1:安装samba相关软件 [root@node-1 ~]# yum -y install samba samba-client Step2:创建共享目录 [root@node-1 ~]# m ...

  3. TZOJ 1693 Silver Cow Party(最短路+思维)

    描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big ...

  4. 解决IE浏览器缓存导致AJAX请求数据异常

    IE10浏览器会把AJAX请求的数据都缓存下来,然后每次想去刷新数据时发现数据都是一样的,于是导致数据显示异常. 解决方法: 在页面<head>标签里,加上以下声明: <!-- 解决 ...

  5. mysql-8.0.15-winx64 解压版安装 图文详解

    1.官网下载 https://dev.mysql.com/downloads/mysql/ 2.解压到合适的目录 3.配置环境变量 ①. path ②.MYSQL_HOME 4.新建一个my.ini  ...

  6. nginx路径设置(web)

    原文 https://www.jianshu.com/p/57db2c5d0cb9 语法 root 语法:root path 默认值:root html 配置段:http.server.locatio ...

  7. C++ 提取网页内容系列之五 整合爬取豆瓣读书

    工作太忙 没有时间细化了 就说说 主要内容吧 下载和分析漫画是分开的 下载豆瓣漫画页面是使用之前的文章的代码 见http://www.cnblogs.com/itdef/p/4171179.html ...

  8. Android Studio导入项目一直卡在Building gradle project info的解决方案

    出现了一个很神奇的现象,Android Studio导入其它项目均正常,但是导入某个项目(两天前还正常打开的项目)却一直卡在Building gradle project info 尝试了重启Andr ...

  9. attempt to open datawindow failed@安装两个PB软件

    attempt to open datawindow failed@安装两个PB软件 安装了不同版本的PB软件后,默认打开方式为后一个安装的版本. 如果想改为第一个安装版本,在“右键”——>”打 ...

  10. 杭州某知名xxxx公司急招大量java以及大数据开发工程师

    因公司战略以及业务拓展,收大量java攻城狮以及大数据开发攻城狮. 职位信息: java攻城狮: https://job.cnblogs.com/offer/56032 大数据开发攻城狮: https ...