对于__getattr__方法的疑惑

对于__getattr__方法的疑惑

class S:

    def __init__(self):
        """initialization method"""

        self._hour = 1
        self._minute = 2
        self._second = 3

    def __setattr__(self, name, value):
        """Assigns a value to an attribute"""

        if name == "hour":
            self.__dict__[ "_hour" ] = value
        else:
            raise ValueError, "Invalid hour value: %d" % value

    def __getattr__(self, name):

        if name == "hour":
            a = 123
            return a
        else:
            raise AttributeError, name


print S().hour

请问上面的__getattr__()方法到底错在哪里啊?
执行结果:

[Copy to clipboard] [ - ]
CODE:
Traceback (most recent call last):
  File "d:\a.py", line 27, in ?
    print S().hour
  File "d:\a.py", line 6, in __init__
    self._hour = 1
  File "d:\a.py", line 16, in __setattr__
    raise ValueError, "Invalid hour value: %d" % value
ValueError: Invalid hour value: 1

可见在__init__中执行了__setattr__引发了异常。还没有运行到__getattr__上去呢。
我想楼主是没有意识到__setattr__和__getattr__把self._hour等也包含进来了。在__init__里面的self._hour = 1其实会调用到__setattr__(self, "_hour", 1)其它的雷同
谢谢楼上的两位了,python的确是太灵活,我感觉有时候太灵活了

java这点比较好,没有那么多的陷阱