Python: 检查属性是否存在时出现AttributeError
Python: AttributeError when checking if properties exist
我有一个日志记录 class,允许将前缀添加到日志中。如果没有给出前缀,它应该默认为“”。
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,然后创建另一个 class 的对象,我试图在其中设置前缀:
class A(PrefixedLog):
def __init__(self, **kwargs):
super(A, self).__init__(**kwargs)
self.b = B()
前缀为class的
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:
行。
我已经搜索过解决方案,但大多数都与格式问题有关...我已确保没有标签。关于问题可能是什么的任何想法?提前致谢。
此外 - 我想确保即使 class 没有专门设置前缀,前缀也会默认为 "" 而不会出现任何错误,即我不必返回对于我拥有的每个 class 并设置前缀。
您是要将代码放在 class 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'
当您写入 self._prefix
时,它会检索属性的值,如果该属性不存在,则会引发 AttributeError
。在这种情况下,您想检查属性是否存在,这就是 hasattr
的用途:
if hasattr(self,"_prefix"):
return self._prefix
else:
return ''
然而,这可以通过 getattr
的回退值来缩短
return getattr(self,"_prefix", '')
我有一个日志记录 class,允许将前缀添加到日志中。如果没有给出前缀,它应该默认为“”。
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,然后创建另一个 class 的对象,我试图在其中设置前缀:
class A(PrefixedLog):
def __init__(self, **kwargs):
super(A, self).__init__(**kwargs)
self.b = B()
前缀为class的
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:
行。
我已经搜索过解决方案,但大多数都与格式问题有关...我已确保没有标签。关于问题可能是什么的任何想法?提前致谢。
此外 - 我想确保即使 class 没有专门设置前缀,前缀也会默认为 "" 而不会出现任何错误,即我不必返回对于我拥有的每个 class 并设置前缀。
您是要将代码放在 class 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'
当您写入 self._prefix
时,它会检索属性的值,如果该属性不存在,则会引发 AttributeError
。在这种情况下,您想检查属性是否存在,这就是 hasattr
的用途:
if hasattr(self,"_prefix"):
return self._prefix
else:
return ''
然而,这可以通过 getattr
return getattr(self,"_prefix", '')