问题标签 [decorator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
6969 浏览

python - 如何在 Python 中将全局标记为已弃用?

我见过装饰器可以让您将函数标记为已弃用,以便在使用该函数时发出警告。我想对全局变量做同样的事情,但我想不出一种检测全局变量访问的方法。我知道 globals() 函数,我可以检查它的内容,但这只会告诉我是否定义了全局(如果该函数已被弃用而不是全部删除,它仍然会是)而不是如果它实际上被使用. 我能想到的最好的选择是这样的:

但除了如何让 DEPRECATED 完全像“3”一样的问题之外,我不确定 DEPRECATED 可以做什么来让您在每次访问它时都能检测到。我认为它可以做的最好的事情是遍历所有全局方法(因为 Python 中的所有内容都是一个对象,所以即使“3”也有方法,用于转换为字符串等)并将它们“装饰”以使其全部被弃用。但这并不理想。

有任何想法吗?有没有其他人解决过这个问题?

0 投票
2 回答
167 浏览

design-patterns - 成本装饰师

对于每个产品,都有相关的成本计算器,如:折扣、商家折扣、商家奖金、每月折扣等。未来,将添加更多成本计算器。

对于每个成本计算,我们都有一个具体的产品类别和许多装饰器。所有产品都应使用所有计算器,因为计算器决定根据产品属性(如产品商家 ID、类别 ID、颜色等)应用其计算。

而且,我们的系统中有数百万种产品需要计算。所以,我们最好缓存装饰过的计算器。因为,在运行时装饰每个产品实体会很昂贵。但这对于装饰器模式来说很难。在我们的情况下使用这种模式似乎是一种气味。

你有什么建议?我们应该使用装饰器、策略还是责任链模式?或无模式。

0 投票
5 回答
31731 浏览

php - 如何在 PHP 中实现装饰器?

假设有一个名为“ Class_A”的类,它有一个名为“”的成员函数func

我希望 " " 通过包装在装饰器类中func来做一些额外的工作。Class_A

有人可以举个例子吗?我从未在 PHP 中使用过 OO。

下面的版本对吗?

上面的代码打算给数组做一些额外的工作。

0 投票
2 回答
982 浏览

python - 如何推断 @staticmethod 所属的类?

我正在尝试实现infer_class一个函数,给定一个方法,找出该方法所属的类。

到目前为止,我有这样的事情:

它不适用于@staticmethod-s,因为我无法想出一种方法来实现这一点。

有什么建议么?

这是infer_class在行动:

0 投票
3 回答
1131 浏览

python - 如何在python初始化期间访问父类?

如何找出我在哪个类中初始化装饰器?由于装饰器尚未绑定到班级,因此我无法找到这一点是有道理的,但是有没有办法解决这个问题?

我需要知道我是哪个班级(由注释行表示)。

0 投票
4 回答
201 浏览

design-patterns - 在装饰器模式中调用装饰器(在方法的开头或结尾)是否重要?

我正在用 Javascript 实现装饰器模式。

我在维基百科中看到了这个例子

现在我的问题是该模式仍然是装饰器模式,在 cost() 函数的开头或结尾调用父类是否重要?

现在,我意识到这取决于每个装饰器的作用......例如,如果你在装饰器中进行乘法或除法而不是加法或减法,它当然会保证不同的结果。

但是除了我在上一段中所说的原因之外,还有什么理由在之前或之后拨打电话吗?

0 投票
4 回答
2594 浏览

php - 在 Zend Framework 中,如何使用装饰器将表单元素包装在标签中?

我想用这样的标签包装表单元素

我能找到的唯一选择是改变位置;但是它只接受'prepend'和'append':

那不是我所追求的。我可以更改 Zend_Form_Decorator_Label 类,但这是最后的选择。

0 投票
2 回答
872 浏览

java - 像这样使用装饰器模式有错吗?

我注意到,在所有说明装饰器模式的示例中,都有一个基类/接口,还有一个继承/实现它的装饰器类,之后,所有装饰类都扩展了装饰器类。大致如下:

上面的层次结构取自维基百科的设计模式页面

问题是,我想装饰一些“操作”类,并具有以下层次结构:

  • 根类是Operation

  • 修饰类可以是 Operation1、Operation2 等等。

我将有一个构造函数在我的 Operation 类中使用一个 Operation 对象,如下所示:

一个执行操作的抽象方法(我们称之为doOperation)(每个子类都覆盖它)和另一个调用“存储”对象的doOperation的方法,如下所示(位于基类中):

问题是,当我可以做 OperationDecorator 类在基类中可以做的所有事情时,我真的看不出这里需要 OperationDecorator 类。如果我这样使用它,我是否滥用了装饰器模式?我错过了它的一些功能吗?

0 投票
2 回答
1560 浏览

java - Servlet 页面装饰:人们使用 Tiles、Sitemesh 还是其他东西?

我已经使用 Tiles 和 Sitemesh 很多年了,虽然我个人更喜欢 Sitemesh 风格的页面装饰,但我通常在 Internet 上并没有看到很多关于 Sitemesh 或 Tiles 的提及。

人们是否积极使用 Tiles 和/或 Sitemesh,或者是否有其他图书馆已经接管了这种能力?

0 投票
2 回答
31745 浏览

python - Python - 在装饰器中获取原始函数参数

我正在尝试为 WSGI+Werkzeug 应用程序中的视图编写“login_required”装饰器。

为此,我需要访问用户的会话,该会话可通过传递给视图方法的 Request 对象访问。

不过,我不知道如何在装饰器中获取 Request 实例。我查看了 PEP318,特别是第四个示例,但我不太明白。

这是我正在尝试的:

但我在尝试调用时遇到索引越界错误args[0]

有什么方法可以访问传递给“login_required”装饰器中“hello”函数的请求参数?