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", '')