only happens when the class defines a custom __getattr__: >>> class Foo(object): ... def __getattr__(self, name): ... if name == "spam": ... return 17 ... else: ... raise AttributeError("%s object has no attribute %r" % ... (self.__class__.__name__, name)) ... @property ... def bacon(self): ... return int.lalala ... >>> >>> f = Foo() >>> f.spam 17 >>> f.bacon Traceback (most recent call last): File "", line 1, in File "", line 7, in __getattr__ AttributeError: Foo object has no attribute 'bacon' <<-- expected 'int object has no attribute lalala' >>> ---------------------------------------------------- without a custom __getattr__ works as expected >>> class Bar(object): ... def __init__(self): ... self.x = 17 ... ... @property ... def bacon(self): ... return int.lalala ... >>> b = Bar() >>> b.x 17 >>> b.bacon Traceback (most recent call last): File "", line 1, in File "", line 7, in bacon AttributeError: type object 'int' has no attribute 'lalala' >>>