如何在装饰器模式中处理“此”引用

独角兽

我在使用装饰器模式的类中遇到问题。

当内部对象在对其他对象的调用中使用“ this”引用时,就会出现问题。这将导致来自接收到“ this”引用的对象的所有调用直接针对内部对象,而无需先经过外部对象。

解决此问题的通常方法是什么?

谢谢。

Dimitris Andreou:

对象具有一个隐式值:它们的身份(可以通过应用进行测试==)。包装它们时,您实际上隐藏了该标识(更糟的是,您还暴露了一个潜在的误导性标识,即包装程序本身的标识)。因此,一种显而易见的方法是通过另一种方式(显式地)公开对象的身份来对此进行补偿。例如,您可能会引入方法Object getIdentity(),该方法返回一个真正代表预期身份的对象,并允许对其进行应用==

但是,巨大的缺点是您仍然允许==装饰器本身使用,例如,存在以下危险:

  • 很自然,可以被欺骗(identity == decorator而不是identity == decorator.getIdentity()
  • 默默地做错事(与运行时异常进行比较-祝您调试顺利)

例如,如果对象具有如下方法,则该问题将不存在:

protected Object getIdentity() {
    return this;
}

在哪个==运算符上进行定义,因此包装器还可以包装被包装对象的标识,而不用自己的对象替换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在装饰器模式中实现委派

Django - 如何在装饰器中访问请求正文?

如何在装饰器中获取参数名称

如何在装饰器中捕获异常

如何在装饰器函数中访问类变量

如何在装饰器中获取构造函数参数?

在装饰器模式中,如何确保最低级别的元素不是装饰器?

我应该在装饰器模式中引发异常以处理验证吗?

如何仅在装饰器中处理* args和** kwargs并保持其他参数不变

如何在类中移动此方法装饰器模式?

如何在装饰器中访问ngStyle键和值?

如何在装饰器中获得Flask可选的URL参数?

如何在装饰器中捕获多个相同类型的异常

如何在装饰器函数中打印函数默认参数?

无法理解如何在装饰器内的包装函数中获取参数

如何在装饰器中比较更多参数?

为什么在装饰器设计模式中需要装饰器?

如何避免硬编码呢?在装饰器中

如何在装饰器中使用上下文管理器以及如何将在装饰器中创建的对象传递给装饰函数

如何获取在装饰器中调用装饰器的视图的URL?

如何在装饰器中注册其装饰的所有功能?

如何在类层次结构中处理python装饰器?

在装饰器中修改功能

在装饰器中捕获异常

在Django中,如何在装饰器函数的请求对象中设置值并从装饰函数中的请求对象访问它

我们如何在装饰器中使用* args和** kwargs

在装饰器的包装器中访问kwargs和args

如何在TypeScript中从装饰器内部重用装饰器

在装饰器中扩展Python中的类