Python:检查属性是否存在时的AttributeError

时间:2016-05-03 16:20:53

标签: python attributeerror

我有一个日志类,允许将前缀添加到日志中。如果没有给出前缀,则默认为“”。

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: 

线。

我已经搜索了解决方案,但大多数都与格式问题有关...我确保没有标签。关于问题可能是什么的任何想法?提前谢谢。

另外 - 我想确保即使一个类没有专门设置一个前缀,那么前缀默认为“”没有任何错误,即我不必回到我拥有的每个类和设置前缀。

2 个答案:

答案 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 ''