我有这样的代码:
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/