python - @property 的分配如何工作? (将 getter 分配给另一个变量。)

标签 python logging properties variable-assignment getter

我有这样的代码:

class Debug(object):
  ...

  @property
  def ThreadAwareLogger(self):
    if not self.logger_instance_for_current_thread:
      self.logger_instance_for_current_thread=self.cloneMainLogger()
    return self.logger_instance_for_current_thread

  def cloneMainLogger(self):
    return logger_instance_for_current_thread

class SomeOtherClass(object):

  def __init__(self):
    ...
    self.logger=debug.ThreadAwareLogger

  def otherMethod(self):
    ...
    self.logger.info("Message")

有问题的是赋值self.logger=debug.ThreadAwareLogger。我不确定 self.logger 的内容是什么。我希望它是整个 getter,并且每次在 SomeOtherClass 中使用 self.logger 时都执行 getter。但我担心 self.logger 中只会存储 getter logger_instance_for_current_thread 的结果。这意味着分配时处于事件状态的线程的记录器。当我调用 self.logger.info("Message") 时,此记录器不必是正确的记录器。

每次调用self.logger.info("Message")时,如何让getter ThreadAwareLogger执行?

旁注: 为什么我实际上需要快捷方式self.logger? 当我决定用 AdvancedThreadAwareLogger 替换 ThreadAwareLogger 时,我将仅更改一项分配,而不是数千次 self.logger.info("Message") 调用。 otherMethod 也不关心将使用哪个记录器。

编辑:

getter 的分配工作如 @unutbu 的答案中所述。但是 getter 的分配会导致一个我以前没有想到的问题。

ThreadAwareLogger中,我实际上调用了cloneMainLogger方法。现在 someOtherClass.logger 的调用以异常结束: AttributeError: 'SomeOtherClass' object has no attribute 'cloneMainLogger'。

到目前为止,我通过一个小技巧绕过了这个问题。 SomeOtherClass 实际上有一个 Debug 实例。因此,我在 ThreadAwareLogger 内部调用 debug.cloneMainLogger() 而不是 self.cloneMainLogger() 。该程序现在可以运行,但我认为它真的很脏。

编辑2:

如果我在方法内部添加行 self.comptreeLogger=Debug.ThreaAwareLogger ;例如cloneMainLogger 我收到 AttributeError: 'property' 对象没有属性 'debug'。 结论:我还​​是不明白解决方案。

最佳答案

获得整个属性的一种方法是创建另一个属性:

class SomeOtherClass:

    @property
    def logger(self):
        return self.debug.ThreadAwareLogger

可能还有其他方法。

关于python - @property 的分配如何工作? (将 getter 分配给另一个变量。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311201/

相关文章:

python - 努力解决Python中的 "a float is required error"

python - 如果日志文件不可用,也不会失败

java - NullPointerException 堆栈跟踪在没有调试代理的情况下不可用

properties - 闭包的计算属性

java - 将 org.apache.commons.configuration.Configuration 转换为 java.util.Properties 的直接方法

c# - 为什么在 C# 中对私有(private)字段使用公共(public)属性?

Python 2.7 : Wrong while loop, 需要一个建议

python - 排序二维列表python

python - 如何检测odoo中看板 View 的拖放事件?

c# - 需要在AssemblyInfo中引用log4net配置文件