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 或者称为包装器,是对函数的一种包装. 它能使函数的功能得到扩充,而同时不用修改函数本身的代码. 它能够增加函数执行前.执行后的行为,而不需对调用函数的代码做任何改变. 下面 ...
随机推荐
- springboot整合devtool无法热部署
参见https://www.cnblogs.com/winner-0715/p/6666579.html.
- 微信小程序开发 - 用户授权登陆
准备:微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 微信小程序开发文档:htt ...
- day 5,格式化输出,for,while, break,continue,列表
本节内容: 1,格式化输出 2,数据类型 3,for 循环 4,while 循环 5,列表 pycharm的简单使用,设置pycharm自动生成日期和计算机用户名 ctrl+d复制一行 1,格式化输出 ...
- NC 6系总账凭证联查原始单据
单据联查凭证可以找个如收款结算单的仿写一个. 而总账凭证联查单据则需要实现联查单据的类,重新写一个类.并把类注册进数据库. 最终效果: public class QuerySellcarryBillS ...
- asp.net core2.0中网站发布的时候,怎么样才配置才可以使视图文件不被打包进去?
默认设置可真是坑~~ https://q.cnblogs.com/q/99680/
- String 常用函数
判断字符串是否包含指定字符str.contains("string"); 查找指定字符索引str.indexOf("s"'); 查找最后出现的字符索引str.i ...
- ----一个roadmap----
在课上了解到了学web前端三个基础,HTML.CSS.JS 从HTML开始,逐步学习CSS.JS 大致写了一个roadmap(应该是roadmap喔 就是这样,以后可能会来更错或者更新 对没错我来更错 ...
- To me
1.流泪的时候不做任何决定: 2.不反复思考同一个问题: 3.不害怕做错什么: 4.有负面情绪是正常的: 5.一切的烦恼都是自找的: 6.说过的话一定要做到: 7.不要去害怕做一件事: 8.无论是对是 ...
- 数据库-mysql语句-查-WEB服务器
(1)MySQL中的查询 (2)WEB服务器 Order: 订单.排序 Set:设置.集合 Table:表.桌子 1.MySQL中的简单查询 —— 查询结果的排序 示例:查询出所有员工信息,要求按工 ...
- python模块:xml.etree.ElementTree
"""Lightweight XML support for Python. XML is an inherently hierarchical data format, ...