2013-01-25 24 views
11
>>> 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__` 

Örneklerin __name__ özniteliği olmamasının nedeni nedir?
belki de, örnek-myname öğesinin __name__'un myname olduğu doğrudur.
Bana mantıksız dilbilgisi kurallarını değil, daha mantıklı mı söylerdin?Python örneklerinin neden __name__ özniteliği yok?

+2

Örneklerde '__name__' özniteliği olması gerektiğini düşündüğünüz nedir? [İlgili belgeler] (http://docs.python.org/2/reference/datamodel.html), sınıflar (ve diğer şeyler) için var olduğunu söylüyor, ancak örnekler için bundan bahsetmiyorum. – Celada

+1

[docs] 'dan (http://docs.python.org/2/library/stdtypes.html?highlight=__name__#class.__name__): '__name__' bir" sınıf veya tür "adı değil, bir sınıf veya türün örneği. Örnekler neden '__name__'s? –

+6

Bunu mu demek istediniz: Foo() .__ class __.__ name__'? –

cevap

14

Sınıfların ve örneklerin uygulanmasının bir yapısını görüyorsunuz. __name__ özniteliği sınıf sözlüğünde saklanmaz; bu nedenle, doğrudan örnek aramadan görülemez.

Sadece __module__ ve __doc__ sınıf sözlüğünde olduğunu görmek için vars(Foo)'a bakın ve örneğe görünür.

Örnekte bir sınıfın adına erişmek için, Foo().__class__.__name__ ile yukarı doğru çalışması gerekir. Ayrıca, sınıfların, sınıf sözlüğünde olmayan ve aynı şekilde örnekte doğrudan erişilemeyen __bases__ gibi başka özelliklere de sahip olduğunu unutmayın.

+0

Çalışma zamanı sırasında sınıfın dinamik olarak ayarlandığını anlıyorum. Ancak, IDE (PyCharm) bu hata hakkında şikayet ediyor. Tip kontrolünü devre dışı bırakmadan bunu önlemek için herhangi bir yolu var mı? – physicalattraction

İlgili konular