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