Questions tagged «decorator»

装饰器是一种面向对象的设计模式,允许以动态方式向现有类添加行为。它是“四人帮”的结构设计模式之一。

5
什么是“装饰器”?如何使用?
我很好奇AngularJS中的装饰器到底是什么。除了AngularJS文档中的简短内容和youtube视频中的简短提及(尽管很有趣)之外,装饰者在线上没有太多信息。 正如Angular所说的那样,装饰器是: 装饰服务,允许装饰者截取服务实例的创建。返回的实例可以是原始实例,也可以是委派给原始实例的新实例。 我真的不知道这意味着什么,而且我不确定为什么要将这种逻辑与服务本身分开。例如,如果我想在不同的条件下返回不同的值,则只需将不同的参数传递给相关函数,或使用共享该私有状态的另一个函数。 我仍然是AngularJS菜鸟,所以我敢肯定,这只是我的愚昧和/或坏习惯。

11
类中的Python装饰器
可以这样写吗: class Test(object): def _decorator(self, foo): foo() @self._decorator def bar(self): pass 这将失败:@self中的self未知 我也尝试过: @Test._decorator(self) 也会失败:测试未知 我想在装饰器中临时更改一些实例变量,然后运行装饰的方法,然后再将其更改回。
140 python  class  decorator  self 

8
代理和装饰器模式之间的差异
您能否给出任何好的解释,Proxy和Decorator有什么区别? 我看到的主要区别是,当我们假设代理使用组合并且装饰器使用聚合时,那么很显然,通过使用多个(一个或多个)装饰器,您可以为预先存在的实例(装饰)修改/添加功能,而代理具有自己的代理类内部实例,并为其添加了一些附加功能(代理行为)的委托。 现在的问题是-不代理创建了聚集仍然是代理还是相当装饰?是否允许(按照GoF模式的定义)创建具有聚合的代理?


8
如何装饰一堂课?
在Python 2.5中,有没有办法创建装饰类的装饰器?具体来说,我想使用装饰器将成员添加到类中,并更改构造函数以获取该成员的值。 寻找类似以下的内容(在“ Foo类:”上存在语法错误: def getId(self): return self.__id class addID(original_class): def __init__(self, id, *args, **kws): self.__id = id self.getId = getId original_class.__init__(self, *args, **kws) @addID class Foo: def __init__(self, value1): self.value1 = value1 if __name__ == '__main__': foo1 = Foo(5,1) print foo1.value1, foo1.getId() foo2 = Foo(15,2) print foo2.value1, foo2.getId() 我想我真正想要的是在Python中执行类似C#接口的方法。我想我应该改变我的范式。

7
python标准库中的装饰器(@deprecated)
我需要将例程标记为已弃用,但显然没有用于弃用的标准库装饰器。我知道它的配方和警告模块,但是我的问题是:为什么没有用于此(常见)任务的标准库装饰器? 附加问题:标准库中是否有标准装饰器?
127 python  decorator 

3
如何在python抽象类中创建抽象属性
在以下代码中,我创建了一个基本抽象类Base。我希望所有从其继承的类都Base提供该name属性,因此我将该属性设置为@abstractmethod。 然后,我创建了一个Base名为的子类,该子类Base_1旨在提供一些功能,但仍保持抽象。中没有name属性Base_1,但是python实例化了该类的对象而没有错误。一个人如何创建抽象属性? from abc import ABCMeta, abstractmethod class Base(object): __metaclass__ = ABCMeta def __init__(self, strDirConfig): self.strDirConfig = strDirConfig @abstractmethod def _doStuff(self, signals): pass @property @abstractmethod def name(self): #this property will be supplied by the inheriting classes #individually pass class Base_1(Base): __metaclass__ = ABCMeta # this class does not provide the …


6
保留装饰功能的签名
假设我编写了一个装饰器,它执行了非常通用的操作。例如,它可能会将所有参数转换为特定类型,执行日志记录,实现备忘录等。 这是一个例子: def args_as_ints(f): def g(*args, **kwargs): args = [int(x) for x in args] kwargs = dict((k, int(v)) for k, v in kwargs.items()) return f(*args, **kwargs) return g @args_as_ints def funny_function(x, y, z=3): """Computes x*y + 2*z""" return x*y + 2*z >>> funny_function("3", 4.0, z="5") 22 到目前为止一切都很好。但是,有一个问题。装饰的函数不保留原始函数的文档: >>> help(funny_function) Help …
111 python  decorator 

8
Python备注/延迟查找属性装饰器
最近,我浏览了现有的代码库,其中包含许多类,其中实例属性反映了存储在数据库中的值。我已经重构了许多这些属性,以便推迟它们的数据库查找。不会在构造函数中初始化,而只能在初次阅读时进行初始化。这些属性在实例的生存期内不会更改,但是它们是第一次计算该瓶颈,并且仅在特殊情况下才真正访问。因此,它们也可以在从数据库中检索出来之后进行缓存(因此,它适合于记忆的定义,其中输入只是“无输入”)。 我发现自己一遍又一遍地输入以下代码段,以获取各个类中的各个属性: class testA(object): def __init__(self): self._a = None self._b = None @property def a(self): if self._a is None: # Calculate the attribute now self._a = 7 return self._a @property def b(self): #etc 我已经不知道有没有使用Python的现有装饰器来执行此操作?或者,是否有合理简单的方法来定义装饰器呢? 我正在Python 2.5下工作,但是2.6答案如果有很大不同,可能仍然很有趣。 注意 在Python包含许多现成的装饰器之前,就曾问过这个问题。我更新它只是为了更正术语。
109 python  decorator 

13
实例方法的装饰器可以访问该类吗?
我有一些大致如下的内容。基本上,我需要从在其定义中的实例方法上使用的装饰器访问实例方法的类。 def decorator(view): # do something that requires view's class print view.im_class return view class ModelA(object): @decorator def a_method(self): # do some stuff pass 原样的代码给出: AttributeError:“函数”对象没有属性“ im_class” 我发现了类似的问题/答案-Python装饰器使函数忘记了它属于Python装饰器中的类和Get类 -但它们依赖于一种变通方法,该方法通过在运行时抢夺第一个参数来获取实例。就我而言,我将基于从其类收集的信息来调用该方法,因此我不能等待调用进入。
109 python  decorator 

5
Webpack Babel 6 ES6装饰器
我有一个用Webpack作为捆绑器的用ES6编写的项目。大部分转译工作正常,但是当我尝试在任何地方包含装饰器时,都会出现此错误: Decorators are not supported yet in 6.x pending proposal update. 我查看了babel问题追踪器,但在那儿找不到任何内容,因此我假设我使用的是错误的。我的webpack配置(相关位): loaders: [ { loader: 'babel', exclude: /node_modules/, include: path.join(__dirname, 'src'), test: /\.jsx?$/, query: { plugins: ['transform-runtime'], presets: ['es2015', 'stage-0', 'react'] } } ] 我没有其他问题,箭头功能,销毁所有功能都正常,这是唯一不起作用的方法。 我知道我总是可以降级到前一段时间使用过的babel 5.8,但是如果有任何方法可以使它在当前版本(v6.2.0)中运行,它将有所帮助。

1
装饰器执行顺序
def make_bold(fn): return lambda : "<b>" + fn() + "</b>" def make_italic(fn): return lambda : "<i>" + fn() + "</i>" @make_bold @make_italic def hello(): return "hello world" helloHTML = hello() 输出: "<b><i>hello world</i></b>" 在大多数示例中,我大致了解装饰器以及它如何与其中之一一起工作。 在此示例中,有2个。从输出看,似乎@make_italic先执行,然后执行@make_bold。 这是否意味着对于装饰功能,它将首先运行该功能,然后移至其他装饰器的顶部?像@make_italic先那么@make_bold,而不是相反。 所以这意味着它与大多数编程语言中的自顶向下方法的规范不同吗?仅用于这种装饰器吗?还是我错了?

3
确定是否在Python中将根记录器设置为DEBUG级别?
如果使用以下命令行参数将日志记录模块设置为DEBUG: if (opt["log"] == "debug"): logging.basicConfig(level=logging.DEBUG) 以后如何判断记录器是否设置为DEBUG?我正在编写一个装饰器,如果将True标志传递给它,它将为函数计时,如果没有给出标志,则默认情况下,当根记录器设置为DEBUG时,它会打印计时信息。

13
如何创建可以使用或不使用参数的Python装饰器?
我想创建一个可以与参数一起使用的Python装饰器: @redirect_output("somewhere.log") def foo(): .... 或不使用它们(例如,默认情况下将输出重定向到stderr): @redirect_output def foo(): .... 那有可能吗? 请注意,我并不是在寻找重定向输出问题的其他解决方案,它只是我想要实现的语法的一个示例。
88 python  decorator 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.