我有一个日志类,允许将前缀添加到日志中。如果没有给出前缀,则默认为“”。
class PrefixedLog(Loggable):
def __init__(self):
self._prefix = None
@property
def prefix(self):
if self._prefix:
return self._prefix
else:
return ""
@prefix.setter
def prefix(self, value):
self._prefix = value
@property
def log(self):
if not hasattr(self, '_log') or not self._log:
log = logging.getLogger(self.__class__.__name__)
self._log = LoggerAdapter(self._prefix, log)
return self._log
我有另一个类,然后创建另一个类的对象,我试图设置前缀:
class A(PrefixedLog):
def __init__(self, **kwargs):
super(A, self).__init__(**kwargs)
self.b = B()
带有前缀的类:
class B(PrefixedLog):
self.another_class = AnotherClass()
if self.prefix:
self.another_class.prefix = 'desired prefix'
我收到了这个错误:
AttributeError: 'B' object has no attribute '_prefix'
上的
if self.prefix:
线。
我已经搜索了解决方案,但大多数都与格式问题有关...我确保没有标签。关于问题可能是什么的任何想法?提前谢谢。
另外 - 我想确保即使一个类没有专门设置一个前缀,那么前缀默认为“”没有任何错误,即我不必回到我拥有的每个类和设置前缀。
答案 0 :(得分:5)
您的意思是将代码放在B
方法的类__init__()
中吗?我想这段代码:
class B(PrefixedLog):
self.another_class = AnotherClass()
if self.prefix:
self.another_class.prefix = 'desired prefix'
应改为:
class B(PrefixedLog):
def __init__(self):
super().__init__()
self.another_class = AnotherClass()
if self.prefix:
self.another_class.prefix = 'desired prefix'
答案 1 :(得分:-3)
当您编写package com. google .common . base;
import com. google .common . annotations. GwtCompatible ;
import javax. annotation .Nullable ;
@GwtCompatible
public abstract interface Function <F , T >
{
@Nullable
public abstract T apply (@Nullable F paramF) ;
public abstract boolean equals (@Nullable Object paramObject) ;
}
时,它会检索属性的值,如果该属性不存在,则会引发self._prefix
。在这种情况下,您需要检查属性是否存在,hasattr
是什么:
AttributeError
但是,可以使用getattr
if hasattr(self,"_prefix"):
return self._prefix
else:
return ''