Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do python instances have no __name__ attribute?

Tags:

>>> class Foo: ...   'it is a example' ...   print 'i am here' ...  i am here >>> Foo.__name__ 'Foo' >>> Foo().__name__ Traceback (most recent call last):   File "<stdin>", line 1, in <module> AttributeError: Foo instance has no attribute '__name__' >>> Foo.__doc__ 'it is a example' >>> Foo().__doc__ 'it is a example' >>> Foo.__dict__ {'__module__': '__main__', '__doc__': 'it is a example'} >>> Foo().__dict__ {} >>> Foo.__module__ '__main__' >>> Foo().__module__ '__main__' >>> myname=Foo() >>> myname.__name__ Traceback (most recent call last):  File "<stdin>", line 1, in <module> AttributeError: Foo instance has no attribute `__name__` 

What is the reason instances have no attribute __name__?
maybe it is ok that the __name__ of instance-myname is myname.
would you mind tell me more logical, not the unreasonable grammar rules?

like image 764
showkey Avatar asked Jan 25 '13 03:01

showkey


1 Answers

You're seeing an artifact of the implementation of classes and instances. The __name__ attribute isn't stored in the class dictionary; therefore, it can't be seen from a direct instance lookup.

Look at vars(Foo) to see that only __module__ and __doc__ are in the class dictionary and are visible to the instance.

For the instance to access the name of a class, it has to work its way upward with Foo().__class__.__name__. Also note that classes have other attributes such as __bases__ that aren't in the class dictionary and likewise cannot be directly accessed from the instance.

like image 52
Raymond Hettinger Avatar answered Oct 04 '22 21:10

Raymond Hettinger