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

2024-05-15 13:09:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个日志类,它允许在日志中添加前缀。如果没有给定前缀,则应默认为“”。在

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

我有另一个类,它创建了另一个类的对象,我试图在其中设置前缀:

^{pr2}$

带前缀的类:

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: 

行。在

我已经找到了解决方案,但大多数都与格式问题有关…我确定没有选项卡。有什么问题吗?提前谢谢。在

另外-我想确保即使一个类没有特别设置前缀,那么前缀也会默认为“”,没有任何错误,也就是说,我不必回到所有的类并设置前缀。在


Tags: selflogprefixreturnifinitvaluedef
2条回答

您的意思是将代码放在__init__()方法内的B类中吗?我认为这个代码:

class B(PrefixedLog):
    self.another_class = AnotherClass()
    if self.prefix:
        self.another_class.prefix = 'desired prefix'

应改为:

^{pr2}$

当您编写self._prefix时,它检索属性的值,如果该属性不存在,它将引发一个AttributeError。在这种情况下,您需要检查属性是否存在,^{}的作用是:

if hasattr(self,"_prefix"):
    return self._prefix
else:
    return ''

但是,这可以用^{}的回退值缩短

^{pr2}$

相关问题 更多 >