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,把它放在我需要的地方.

python 装饰器有哪些_Python装饰器有哪些常见用途?相关推荐

  1. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  2. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  3. python装饰器参数讲解_python装饰器的详细解析

    写在前面: python装饰器(fuctional decorators)就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能. 这个函数的特殊之处在于它的 ...

  4. python中的装饰器怎么运行_Python 装饰器入门(上)

    翻译前想说的话: 这是一篇介绍python装饰器的文章,对比之前看到的类似介绍装饰器的文章,个人认为无人可出其右,文章由浅到深,由函数介绍到装饰器的高级应用,每个介绍必有例子说明.文章太长,看完原文后 ...

  5. python自带装饰器详解_Python装饰器详解

    引言 装饰器简单来说是我们向一个现有的已经存在的函数或对象添加新的功能,同时呢我们又不用改变他现有的结构. 为什么我们需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye( ...

  6. python装饰器应用论文_Python装饰器的应用场景代码总结

    装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 json/YAML 类似响应后篡改 为函数提供额外的数据 ...

  7. python装饰器传递参数_Python装饰器高级版—Python类内定义装饰器并传递self参数...

    本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递 目录: 一.基本装饰器 二.在类里定义装饰器,装饰本类内函数 三.类装饰器 正文: 一.基本装饰器 装饰不 ...

  8. python描述器 触发事件_Python描述器引导(转)

    原文:http://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html 作者: Raymond Hettinger 联系: 翻译: h ...

  9. python中的eof错误_python – 解析器YACC中的EOF错误

    我试图使用PLY库中为Python提供的yacc解析器来解析字符串. 解析器本身很长,但我遇到的问题是它总是给我同样的错误,无论我放什么样的字符串. 错误是这样的: yacc:输入中的解析错误. EO ...

  10. python解析器的作用_Python 解析器

    2008-01-07 17:55 星期一 嵌入Python解析器执行一些简单的Python 脚本脚本很容易,但是当python解析器用到扩展模块时和多个线程都需要Python解析器执行脚本时,遇到了一 ...

最新文章

  1. python lxml 安装及应用
  2. java 1099_【LeetCode(Java) - 1099】小于 K 的两数之和
  3. 浪潮英特尔在德国发布KEEP升级计划 用户可提前体验英特尔KNM
  4. python中属于私有属性的是_Python中的实例属性和私有属性
  5. Selenium爬虫
  6. spring security oauth2_SpringBoot2 整合OAuth2实现统一认证
  7. Python 数据结构与算法——快排
  8. Lintcode 尾部的零
  9. 阿里巴巴全资收购中国网络配送平台饿了么
  10. 签了之后才后悔了--转载--职场心法
  11. FTP 在局域网搭建ftp服务器-共享文件资料
  12. java游戏 天剑传承,《天剑传承》之无双迷宫攻略
  13. 避免使用隐式类型转换
  14. NPM problem: npm ERR! extraneous
  15. POJ1163 The Triangle
  16. QT和linux实现简易远程聊天工具
  17. 使用PIA查找组件的PeopleSoft导航
  18. 精美的android ui框架,Android酷炫实用的开源框架(UI框架)
  19. java检测工具_常用Java代码质量检测评估工具
  20. SpringBoot 优雅停机

热门文章

  1. psql where里有自定义函数慢_使用gplearn自定义特征自动生成模块
  2. oracle 安装找不到服务,win7 下安装oracle 11g出现错误: 启动服务出现错误 找不到服务OracleMTSRecoveryService...
  3. 软件工程导论 银行储蓄系统_银行计算机储蓄系统
  4. mysql 原生 添加数据_手撸Mysql原生语句--增删改查
  5. java 无名类做参数_说说你知道的几种主要的JVM参数
  6. oracle sql 匹配 一位,oracle -sql模式匹配
  7. sql另一个安装程序实例已在运行_SQL 经典实例
  8. JSP、ASP、PHP Web应用程序怎么这么多P!
  9. 图论--欧拉回路--弗罗莱算法模板
  10. [图神经网络] 图节点Node表示---GCN