python 装饰器有哪些_Python装饰器有哪些常见用途?

RSabet..

123

我使用装饰器主要用于计时目的

def time_dec(func):

def wrapper(*arg):

t = time.clock()

res = func(*arg)

print func.func_name, time.clock()-t

return res

return wrapper

@time_dec

def myFunction(n):

...

好例子!不知道它做了什么.解释你在那里做什么,以及装饰者如何解决问题将是非常好的. (19认同)

在Unix下,`time.clock()`测量CPU时间.如果你想测量挂钟时间,你可能想要使用`time.time()`. (11认同)

好吧,它衡量`myFunction`运行所需的时间...... (7认同)

John Fouhy..

95

我用它们进行同步.

import functools

def synchronized(lock):

""" Synchronization decorator """

def wrap(f):

@functools.wraps(f)

def newFunction(*args, **kw):

lock.acquire()

try:

return f(*args, **kw)

finally:

lock.release()

return newFunction

return wrap

正如评论中指出的那样,从Python 2.5开始,您可以将with语句与threading.Lock(或multiprocessing.Lock自2.6版本)对象结合使用, 以简化装饰器的实现:

import functools

def synchronized(lock):

""" Synchronization decorator """

def wrap(f):

@functools.wraps(f)

def newFunction(*args, **kw):

with lock:

return f(*args, **kw)

return newFunction

return wrap

无论如何,你这样使用它:

import threading

lock = threading.Lock()

@synchronized(lock)

def do_something():

# etc

@synchronzied(lock)

def do_something_else():

# etc

基本上,它只是把lock.acquire()/ lock.release()在函数调用的两侧.

可能是合理的,但装饰者本质上是混乱的,尤其是.来到你身后的第一年的新手,并尝试修改你的代码.简单地避免这种情况:只需将do_something()将其代码括在"with lock:"下的块中,每个人都可以清楚地看到你的目的.装饰者被那些想要看起来很聪明的人(实际上很多人)大量过度使用,但随后代码变成了凡人,并且得到了充实. (17认同)

@TaylerJones,代码可读性是我写作时的最高优先级.每次修改代码时,代码读取次数超过7次.难以理解的代码(对于新手或在时间压力下工作的专家)是每次有人访问源树时必须支付的技术债务. (17认同)

@KevinJ.Rice约束你的代码,以便'第一年的新手'可以更好地理解它是可怕的做法.Decorator语法更容易阅读,并且极大地解耦了代码. (16认同)

Simon..

68

我使用装饰器进行类型检查参数,这些参数通过一些RMI传递给我的Python方法.因此,不是重复相同的参数计数,而是一次又一次地异常提升mumbo-jumbo

def myMethod(ID, name):

if not (myIsType(ID, 'uint') and myIsType(name, 'utf8string')):

raise BlaBlaException() ...

我只是宣布

@accepts(uint, utf8string)

def myMethod(ID, name):

...

和accepts()为我做所有的工作.

对于任何有兴趣的人,在PEP 318中都有`@ accepted`的实现. (15认同)

我认为有错字..第一种方法应该接受..你宣称两者都是"myMethod" (2认同)

cdleary..

47

装饰器用于任何您希望透明地"包装"其他功能的东西.

您可以使用类装饰器将命名日志添加到类中.

任何足够通用的功能,你可以"适应"现有的类或功能的行为是公平的装饰游戏.

Torsten Mare..

24

对于nosetests,您可以编写一个装饰器,它提供具有多组参数的单元测试函数或方法:

@parameters(

(2, 4, 6),

(5, 6, 11),

)

def test_add(a, b, expected):

assert a + b == expected

DNS..

23

Twisted库使用装饰器与生成器相结合,给出异步函数同步的错觉.例如:

@inlineCallbacks

def asyncf():

doStuff()

yield someAsynchronousCall()

doStuff()

yield someAsynchronousCall()

doStuff()

使用它,本来可以分解成大量小回调函数的代码可以很自然地编写为单个块,使其更容易理解和维护.

MisterMetaph..

12

当然,一个显而易见的用途是记录:

import functools

def log(logger, level='info'):

def log_decorator(fn):

@functools.wraps(fn)

def wrapper(*a, **kwa):

getattr(logger, level)(fn.__name__)

return fn(*a, **kwa)

return wrapper

return log_decorator

# later that day ...

@log(logging.getLogger('main'), level='warning')

def potentially_dangerous_function(times):

for _ in xrange(times): rockets.get_rocket(NUCLEAR=True).fire()

DzinX..

8

我主要用它们来调试(打印一个打印其参数和结果的函数的包装)和验证(例如检查一个参数是否是正确的类型,或者在Web应用程序的情况下,如果用户有足够的权限调用一个特定的方法).

luc..

6

我使用以下装饰器来创建函数threadsafe.它使代码更具可读性.它几乎与John Fouhy提出的类似,但不同之处在于,它只能处理单个函数,并且不需要明确地创建锁定对象.

def threadsafe_function(fn):

"""decorator making sure that the decorated function is thread safe"""

lock = threading.Lock()

def new(*args, **kwargs):

lock.acquire()

try:

r = fn(*args, **kwargs)

except Exception as e:

raise e

finally:

lock.release()

return r

return new

class X:

var = 0

@threadsafe_function

def inc_var(self):

X.var += 1

return X.var

那真的很危险.方法inc_var()是"线程安全的",因为一次只能有一个人调用它.也就是说,由于该方法对成员变量"var"进行操作,并且可能其他方法也可能对成员变量"var"进行操作,并且这些访问不是线程安全的,因为锁不是共享的.以这种方式做事给X类用户带来了错误的安全感. (5认同)

Nikhil Chell..

5

装饰器既可用于定义函数的属性,也可用作修改函数的样板; 这是可能的,但反直觉的是他们返回完全不同的功能.看看这里的其他响应,似乎最常见的用途之一是限制其他一些进程的范围 - 无论是日志记录,分析,安全检查等.

CherryPy使用对象分派来匹配对象的URL,最终匹配方法.这些方法的装饰者发出信号,表明CherryPy是否被允许使用这些方法.例如,改编自教程:

class HelloWorld:

...

def secret(self):

return "You shouldn't be here."

@cherrypy.expose

def index(self):

return "Hello world!"

cherrypy.quickstart(HelloWorld())

aatifh..

5

我最近在使用社交网络Web应用程序时使用它们.对于社区/团体,我应该授予成员资格以创建新的讨论并回复您必须成为该特定组成员的消息.所以,我写了一个装饰师@membership_required,把它放在我需要的地方.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码统计工具有哪几种_跟我学“Linux”小程序Web版开发(四):引入统计及Crash收集...

在完成了产品的基础开发以后,接下来需要进行一些周边的工作,这些周边工具将会帮助下一步优化产品。在完成了产品的基础开发以后,接下来需要进行一些周边的工作,这些周边工具将会帮助下一步优化产品。为什么要加应用统计和 Crash 收…

mmseg java_MMSeg中文分词算法

Java中有一些开源的分词项目,比如:IK、Paoding、MMSEG4J等等。这里主要说的是MMSEG4J中使用的MMSeg算法。它的原文介绍在:http://technology.chtsai.org/mmseg/,是用英文书写的,这是只是它的一个中文笔记。为什么中文要…

python查看文档的软件_Python __doc__属性:查看文档

前面介绍了使用 help() 函数来查看程序单元的帮助信息。比如导入 string 模块之后,即可使用 help() 函数来查看指定程序单元的帮助信息。例如,在交互式解释器中输入如下命令来查看 string 模块下 capwords() 函数的作用:>>> help(st…

python重写和装饰器_python中的装饰器

装饰器的本质:当你在用某个decorator来修饰某个函数func时,如下所示:decoratordef func():pass其解释器会解释成下面这样的语句:funcdecorator(func)本质是把一个函数当作参数传递到另一个函数中,然后再调用。def hell…

python3不等于号_python中的不等于号是什么

python中的不等于号用!表示。Python支持的比较运算符如下图所示比较运算符,也成关系运算符,用于对常量、变量或表达式的结果进行大小、真假等比较,如果比较结果为真,则返回 True;反之,则返回 False。比较运…

java的abstract的意思_java – spring中的abstract =“true”是什么意思?

Spring中的抽象bean有点不同于抽象类。事实上,Spring中的抽象bean甚至不需要映射到任何类。以此为例:和类:public class FooDao {private DataSource dataSource;private SomeHelper someHelper;private FooHelper fooHelper;//setters}publi…

错误:不能继续进行下一步操作 openfire 设置._如何为MacBook或Mac电脑恢复出厂设置...

mac电脑经过长时间的使用后会变得卡顿,或者因为部分操作方式改变以至于给我们在使用过程中造成障碍,此时我们可以进行恢复出厂设置,以此来解决部分问题。那么该如何为MacBook或Mac电脑恢复出厂设置呢?下面跟随小编来一起学习一下吧…

java枚举类型测试_Java枚举类的使用

1、自定义枚举类// 测试类public class enumDemo {public static void main(String[] args) {System.out.println(Season.SPRING);System.out.println(Season.SUMMER);System.out.println(Season.AUTUMN);System.out.println(Season.WINTER);}}// 自定义枚举类class Season {//…

mac显示网速_Mac网络流量监控工具——NetWorker pro

NetWorker pro for Mac是Mac系统上一款轻量级的网速实时监测软件,可以让用户在菜单栏上显示当前的网络上传下载速度,可以在速度和流量两种模式之间切换,也可以选择不同的网络模式来进行监测。此外,networker mac还提供有关当前活动…

南京java架构师工资_java架构师工资一般是多少?怎么提升才能获得高薪?

这几年Java一直以自身的优势霸占榜首,而且其实java架构师工资也是行业比较高的,下面来看看java架构师的工资到底有多少,当然这也是要区分地区的,以及怎样提高自己才能获得高薪呢?当程序员容易,当一个优秀的…

matlab gui学习手记_MATLAB论坛不可错过的30例GUI源代码

​过去的两年中,我经常会在微信公众号和知乎上分享,平时如何通过MATLAB制作GUI,来让自己的工作和生活更加便捷与高效。在分享的同时,有不少朋友会给我留言提问关于MATLAB GUI的问题。而其中的许多问题,其实都是能够在M…

线性回归csv数据集_用mxnet的gluon线性回归训练只有两个特征的数据集

前言自从上次试着用最基础的线性回归训练一个有80个特征的数据集,梯度爆炸之后,今天拿一个简单到不能再简单的数据集试试能不能成功收敛。途中我们又会遇到什么问题?数据集来自吴恩达机器学习课程第二周的课后练习。原本是txt文件&#xff0c…

java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式

在平时的项目开发中,应该会经常遇到上图所示的需求,就是在一个页面中有多个标签,被选中的标签颜色会高亮显示,切换不同标签显示相应的不同内容。如果内容代码过多则写在同一个html文件就会显得特别乱,所以这里我们最好…

Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结

文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂的应用程序,DOM 提供了大量灵活性。DOM标准是标准的。它很强壮且完整,并且有许多实现。这是许多大型安装的决定因素--特别是对产品应用程序,以避免在API发生改变时进行大量…

禅道项目管理_禅道 11.6.1 版本发布,完善细节,修复 Bug

禅道项目管理软件集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体,是一款功能完备的项目管理软件,完美地覆盖了项目管理的核心流程。禅道官网:www.zentao.net。大家好,禅道项目管理软件11.6.1发布&#xff0…

mendeley引用参考文献不显示_免费文献管理器Mendeley

June 2020有机合成化学文献检索今天小编给大家分享一款免费又好用的文献管理器——Mendeley,另外晶体cif文件下载—Materialsproject和COD数据库可在菜单栏的文献检索[文献管理/资源]中查看Mendeley是什么Mendeley是一款免费的跨平台文献管理软件,同时也…

pgsql vs mysql查询_对比平台--SQL Server Vs PostgreSQL

Microsoft SQL Server是一个数据库管理和分析系统,主要用于电子商务,业务范围和不同的数据仓库解决方案。另一方面,PostgreSQL是高级的对象关系数据库管理系统,它为SQL标准的扩展子集提供支持,包括不同的事务&#xff…

停车场管理系统代码_jsp19109商场商铺停车场服务系统-SSM-Mysql

jsp19109商场商铺停车场服务系统-SSM-Mysql该设计有演示视频    100%能运行买重包换  保密发送  一校一份编号:jsp19109语言数据库:jspMysql论文字数:12032字摘 要随着社会的发展,社会的方方面面都在利用信息化时代的优势。计…

java中compare语句的用法_Java RuleBasedCollator compare()用法及代码示例

java.text.RuleBasedCollat​​or类的compare()方法用于比较两个对象的强度,并且根据结果将返回0,正值和负值作为输出。用法:public int compare(Object o1, Object o2)参数:此方法需要两个对象之间进行比较。返回值:如果第一个对…

qregexp限制数字范围_数字系统实现电压电流控制的必经之路数模转换器

《芯势力》系列接上一篇文章,我们了解到了模数转换器,本文将带你了解数模转换器。看名字就能知道,如果模数转换器实现了模拟信号到数字信号的转换,那么,数模转换器就是模数转换器的逆过程,即把数字信号转换…