>>> 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With