Python中的装饰器的简单介绍01
一. 装饰器是什么?
简单来说,装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问。
二.装饰器语法
(1)无参数装饰器
def deco(func):
print (func)
return func
@deco
def foo():
pass
foo()
第一个函数deco是装饰函数,它的参数就是被装饰的函数对象。我们可以在deco函数内对传入的函数对象做一番“装饰”,然后返回这个对象(记住一定要返回 ,不然外面调用foo的地方将会无函数可用。实际上此时foo=deco(foo)
下面是一个简单的例子,检查函数有没有说明文档:
def deco_functionNeedDoc(func):
if func.__doc__ == None :
print (func.__name__, "has no __doc__, it's a bad habit.")
else:
print (func.__name__, ':', func.__doc__, '.')
return func
@deco_functionNeedDoc
def f():
print ('f() Do something')
@deco_functionNeedDoc
def g():
'I have a __doc__'
print ('g() Do something')
f()
g() #输出如下
#f has no __doc__, it's a bad habit.
#g : I have a __doc__ .
#f() Do something
#g() Do something
#[Finished in 0.2s]
(2)有参数装饰器
不使用装饰器的实现代码:
import time
import datetime def outter(func):
def inner(args):
start=datetime.datetime.now()
func(args)
end=datetime.datetime.now()
cost=end-start print("execute %s spend %s"%(func.__name__,cost.total_seconds()))
return (inner) def func2(args):
time.sleep(args) f=outter(func2)
f(1) #输出如下:
#execute func2 spend 1.014
#[Finished in 1.2s]
使用装饰器的代码实现如下:
import time
import datetime
import functools def outter(func):
@functools.wraps(func)
def inner(*args,**kwargs):
'''This is inner'''
start=datetime.datetime.now()
func(*args,**kwargs)
end=datetime.datetime.now()
cost=end-start print("execute %s spend %s"%(func.__name__,cost.total_seconds()))
return (inner) @outter
def func2(args):
'''This is func2'''
time.sleep(args) @outter
def func3(m,n):
'''This is func3'''
print("m+n={0}".format(m+n)) func2(1)
print(func2.__name__)
print(func2.__doc__) func3(m=2,n=3)
print(func3.__name__)
print(func3.__doc__) #加了@functools.wraps(func)装饰器的输出结果
# execute func2 spend 1.000413
# func2
# This is func2
# m+n=5
# execute func3 spend 0.0
# func3
# This is func3
# [Finished in 1.2s] #不加@functools.wraps(func)装饰器的输出结果 # execute func2 spend 1.000413
# inner
# This is inner
# m+n=5
# execute func3 spend 0.0
# inner
# This is inner
# [Finished in 1.2s]
Python中的装饰器的简单介绍01的更多相关文章
- Python中的装饰器的简单介绍02
这篇博文转载自伯乐在线的12步轻松搞定python装饰器,重构成python3. 1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例 ...
- 简单说明Python中的装饰器的用法
简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下 装饰器对与 ...
- python中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
- 【Python】python中的装饰器——@
对装饰器本来就一知半解的,今天终于弄清楚了,Python中的装饰器是对装饰者模式的很好运用,简化到骨子里了. python中为什么需要装饰器,看这里:http://www.cnblogs.com/hu ...
- Python 中实现装饰器时使用 @functools.wraps 的理由
Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展.但是在使用过程中,由于装饰器的加入导致解释器认为函数本身发生了改变,在某些情况下——比如测试时——会导致一些问题.Python 通过 ...
- 写python中的装饰器
python中的装饰器主要用于在已有函数实现功能前附加需要输出的信息,下面将用实例展示我如何写装饰器. 首先分别尝试写装饰器装饰一个无参函数和一个有参函数(被装饰函数仅输出,无返回值情况下) def ...
- python中的装饰器decorator
python中的装饰器 装饰器是为了解决以下描述的问题而产生的方法 我们在已有的函数代码的基础上,想要动态的为这个函数增加功能而又不改变原函数的代码 例如有三个函数: def f1(x): retur ...
- 三分钟搞定Python中的装饰器
python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能. 装饰器存在的意义是什么呢?我们知道,在python中函数可以调用 ...
- 浅显易懂的谈一谈python中的装饰器!!
hello大家好~~我是稀里糊涂林老冷,一天天稀里糊涂的. 前一段时间学习了装饰器,觉着这东西好高大上哇靠!!哈哈,一定要总结一下,方便以后自己查阅,也希望帮助其他伙伴们共同进步! 装饰器: 大家可以 ...
随机推荐
- 关于.net里面的静态html页面和接口组合使用的网站
在网站的根目录下,主要有三部分组成.①接口里面的bin文件夹②接口③html里面的页面. html里面有ajax请求接口的js代码.另外接口里面的web.config不需要拷贝到网站根目录去. 如下截 ...
- One VS Rest
简单来说就是分类的类别有多个,不再是二分,比如根据某些特征,什么温度.湿度.空气流动情况来预测天气,天气的label不能说是好天气和坏天气两种,而是分晴天.雨天.阴天,雪天等等,对于决策树或者从计算机 ...
- spring cloud zuul参数调优
zuul 内置参数 zuul.host.maxTotalConnections 适用于ApacheHttpClient,如果是okhttp无效.每个服务的http客户端连接池最大连接,默认是200. ...
- c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environment.Exit(0);
本文实例总结了C#中WinForm程序退出方法技巧.分享给大家供大家参考.具体分析如下: 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit ...
- https://scrapingclub.com/exercise/basic_captcha/
def parse(self, response): # set_cookies = response.headers.getlist("set-cookie").decode(& ...
- WIFI CAT ET III Adapter Caterpillar ET3 New Arrival
The old bluetooth cat et adatper iii has stopped production, and you can get the new WIFI CAT Caterp ...
- Android项目第一天,下载安装Android Studio和“我的第一个安卓项目”
一.AS的下载我是在AS官方网站进行下载的最新版本,如图所示 二.AS的安装过程 点击你下载的安装包安装即可,傻瓜式一站到底. 到这一步时选择第二个按钮, 随后出现如下界面 这个窗口是提示我们设置代理 ...
- Flutter从零到∞学习笔记
有状态widget:StatefulWidget和无状态widget:StatelessWidget 前者不需要实现Widget build(BuildContext context). 具体的选择取 ...
- spring mvc 的上传图片是怎么实现的?
spring mvc 的上传图片是怎么实现的? 导入jar包,commons-io.jar 及 commons-fileupload.jar 在springmvc的配置文件中配置Mutipart解析器 ...
- MyEclipse运行Java出错:could not find the main class:test.program will exit(导入项目)
自己新建的项目运行没有任何问题.但是我导入的很早以前别人写的项目,然后run就会弹框could not find the main class:test.program will exit 请确认JA ...