python之装饰器(decorator)
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)的更多相关文章
- python函数编程-装饰器decorator
函数是个对象,并且可以赋值给一个变量,通过变量也能调用该函数: >>> def now(): ... print('2017-12-28') ... >>> l = ...
- python 深入浅出装饰器(decorator)--举的例子关于星级争霸2(starcraft2)
其实早就想写一篇深入浅出装饰器的文章,苦于一直没有找到很好的例子描述,自己除了在写api参数检测和日志打印的时候用到以外,其他地方也没有什么重度使用所以一直没有写. 我不会讲解装饰器的理论,还有各种基 ...
- 详解python的装饰器decorator
装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...
- 关于Python的装饰器 decorator
装饰器的原理:其实就是高阶函数,接收原函数以在之前之后进行操作. 语法格式是固定的:先定义一个函数,再使用@语法调用该函数. 例子一: import functools # 定义装饰器,固定格式 de ...
- Python学习——装饰器/decorator/语法糖
装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...
- 关于python的装饰器(初解)
在python中,装饰器(decorator)是一个主要的函数,在工作中,有了装饰器简直如虎添翼,许多公司面试题也会考装饰器,而装饰器的意思又很难让人理解. python中,装饰器是一个帮函数动态增加 ...
- python 装饰器(decorator)
装饰器(decorator) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语 ...
- python语法32[装饰器decorator](转)
一 装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的 ...
- python 语法之 装饰器decorator
装饰器 decorator 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...
随机推荐
- 深入理解Jvm 虚拟机
参考: 内存模型:https://blog.csdn.net/qq_34280276/article/details/52783096 类加载原理:https://nomico271.github.i ...
- WM-结汇
PI发给客户以后, 客户打过来定金之后. 把PI的 P单词去掉,改为只剩invoice, 再把PI改成一份contract为标题的文件,两份文件都是要自己和客户的签字的. 然后需要用这两份文件进行结汇 ...
- 220. Contains Duplicate III 数组指针差k数值差t
[抄题]: Given an array of integers, find out whether there are two distinct indices i and j in the arr ...
- 完全理解 Python 迭代对象、迭代器、生成器
完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun 本文源自RQ作者 ...
- JS-基础动画心得
写在前面的话:这两种动画方式主要在于对其中算法的理解,理解其中的向上和向下取整很关键.还有一个我犯的毛病,写样式的时候忘记给轮播图ul定位,导致效果出不来,所以有bug时记得排除下css 常用的三种动 ...
- HTTP状态码之【整理篇】
=================================================================================== 状态码的职责:当客户端向服务器端 ...
- xpath&css选择器
本文参考较多,原创基本没有,权当知识归纳. xpath并不复杂,简单的使用看完之后,及时查阅文档也是可以写出来的. 这里放上我的练手文件,大家可以参考,或者挑毛病(*^__^*) 嘻嘻-- xpath ...
- [费用流][BZOJ1070]修车
修车 题目描述 同一时刻有位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均 ...
- js 新增标签、标签属性
var table = document.getElementById('content_list'); console.log(ret.data.length); ;i<ret.data.le ...
- 2019.02.21 bzoj2739: 最远点(决策单调性+分治)
传送门 题意简述:给一个N个点的凸多边形,求离每一个点最远的点. 思路:先根据初中数学知识证明决策是满足单调性的,然后上分治优化即可. 才不是因为博主懒得写二分+栈优化呢 代码: #include&l ...