Python 为什么调用_getattr__而不是捕获AttributeError?

Python 为什么调用_getattr__而不是捕获AttributeError?,python,inheritance,attributeerror,getattr,Python,Inheritance,Attributeerror,Getattr,我在Python类中实现了一个简单的延迟初始化: 类库: 定义初始化(自): 通过 def _uGetAttr _;(自身,项目): print(调用了“getattr!”) 派生类(基): def GetValue(自身): 尝试: 返回self.val 除属性错误外: self.val=1 返回self.val obj=派生的() 打印(obj.GetValue()) 我想在调用方法GetValue()时捕获AttributeError。在本例中,不会发生这种情况,会调用方法getattr

我在Python类中实现了一个简单的延迟初始化:

类库:
定义初始化(自):
通过
def _uGetAttr _;(自身,项目):
print(调用了“getattr!”)
派生类(基):
def GetValue(自身):
尝试:
返回self.val
除属性错误外:
self.val=1
返回self.val
obj=派生的()
打印(obj.GetValue())

我想在调用方法GetValue()时捕获AttributeError。在本例中,不会发生这种情况,会调用方法getattr。基类中的方法getattr()是必需的,我不能放弃使用它。如果可能的话,我也不想放弃使用try-except-block。在Python2.7中,这个问题的解决方案是什么?

如果不能放弃使用
\uuu getattr\uuu
方法,则必须手动抛出异常

class Base:
    def __init__(self):
        pass

    def __getattr__(self, item):
        print('__getattr__ was called!')

        if not hasattr(self, item):
            raise AttributeError(self.__class__.__name__ +
                " instance has no attribute '" + item + "'")

class Derived(Base):
    def GetValue(self):
        try:
            return self.val
        except AttributeError:
            self.val = 1
            return self.val

obj = Derived()
print(obj.GetValue())

如果定义了
\uuu getattr\uuuu
但没有抛出属性错误,为什么会抛出属性错误?在您的示例中,该方法有什么意义呢?
GetValue
方法不会在任何地方调用。我已将代码更改为调用方法GetValue()。jonrsharpe这是我问题的解决方案,我已在u getattr_uuu()中添加了引发AttributeError,谢谢。