AttributeError的属性和__getattr__兼容性问题

Vin*_*ent 7 python properties

我刚刚遇到了意想不到的行为.这是一个带有__getattr__方法和属性属性的简单类,里面有一个拼写错误:

class A(object):
    def __getattr__(self, attr):
        if not attr.startswith("ignore_"):
            raise AttributeError(attr)

    @property
    def prop(self):
        return self.some_typo

a = A() # Instantiating
a.ignore_this # This is ignored
a.prop # This raises an Attribute Error
Run Code Online (Sandbox Code Playgroud)

这是预期的结果(如果__getattr__被评论,我得到的结果):

AttributeError: 'A' object has no attribute 'some_typo'
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

AttributeError: prop
Run Code Online (Sandbox Code Playgroud)

我知道这与__getattr__捕获有关,AttributeError但这个问题有一个很好的和干净的解决方法吗?因为我可以向你保证,这是一个调试噩梦......

mgu*_*arr 5

您可以提出更好的异常消息:

class A(object):
  def __getattr__(self, attr):
    if not attr.startswith("ignore_"):
      raise AttributeError("%r object has not attribute %r" % (self.__class__.__name__, attr))

  @property
  def prop(self):
    return self.some_typo

a=A()
a.ignore_this
a.prop
Run Code Online (Sandbox Code Playgroud)

编辑:__getattribute__从对象基类调用解决了问题

class A(object):
  def __getattr__(self, attr):
    if not attr.startswith("ignore_"):
      return self.__getattribute__(attr)

  @property
  def prop(self):
    return self.some_typo
Run Code Online (Sandbox Code Playgroud)

  • 答案的第二部分极大地帮助我解决了 `__getattr__()` 和 `@property` 之间的兼容性问题。值得注意的是,调用`getattr(self, attr)` 会导致无限递归。 (2认同)