why __repr__ affected after __getattr__ overloaded?
Peter Otten
__peter__ at web.de
Fri Jun 22 03:11:14 EDT 2007
Roc Zhou wrote:
> I'm sorry but I still have a question, look at this example:
>>>> class test:
> ... def __init__(self):
> ... self.x = 1
> ... def __getattr__(self, attr_name):
> ... print attr_name
> ... if attr_name == 'y':
> ... return 2
> ... else:
> ... raise AttributeError, attr_name
> ...
>>>> t = test()
>>>> t.x
> 1
>>>> t.y
> y
> 2
>>>> print t.x
> 1
>>>> print t
> __str__
> __repr__
> <__main__.test instance at 0xb7f6d6cc>
>
> Since __str__ and __repr__ does not exist because their names was
> printed, why not the "AttributeError" be raised?
Because classic classes invoke
t.__getattr__(self, "__repr__")
and expect that to return a proper __repr__() method -- unless __getattr__()
raises an AttributeError:
>>> class Test:
... def __getattr__(self, name):
... if name == "__repr__":
... raise AttributeError
... return "<inexistent %r>" % name
...
>>> t = Test()
>>> t
<__main__.Test instance at 0x401d42ac>
If you use newstyle classes you won't run into that particular problem:
>>> class Test(object):
... def __getattr__(self, name):
... return "<inexistent %r>" % name
...
>>> t = Test()
>>> t
<__main__.Test object at 0x401d426c>
>>> t.yadda
"<inexistent 'yadda'>"
More information about the Python-list
mailing list