>>> 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?
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.