2013-01-25 9 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__` 

인스턴스에 __name__ 속성이없는 이유는 무엇입니까?
어쩌면 instance-myname의 __name__myname 인 것이 좋습니다.
좀 더 논리적이지, 불합리한 문법 규칙이 아닌가요?왜 파이썬 인스턴스에 __name__ 속성이 없습니까?

+2

인스턴스에 '__name__'속성이 있어야한다고 생각하는 이유는 무엇입니까? [관련 문서] (http://docs.python.org/2/reference/datamodel.html)에는 클래스 (및 다른 것들)에 대해 언급되어 있지만 인스턴스에 대한 언급은 없습니다. – Celada

+1

[docs] (http://docs.python.org/2/library/stdtypes.html?highlight=__name__#class.__name__) : '__name__'은 (는) '클래스 또는 유형'의 이름입니다. 클래스 또는 유형의 인스턴스. 인스턴스에 '__name__'이 있어야하는 이유는 무엇입니까? –

+6

'Foo() .__ class __.__ name__'을 원하셨습니까? –

답변

14

클래스 및 인스턴스 구현의 아티팩트가 표시됩니다. __name__ 속성은 클래스 사전에 저장되지 않습니다. 따라서 직접 인스턴스 조회에서 볼 수 없습니다.

__module____doc__ 만 클래스 사전에 있으며 인스턴스에서 볼 수 있음을 확인하려면 vars(Foo)을 확인하십시오.

클래스 이름에 액세스하는 인스턴스의 경우 위로는 Foo().__class__.__name__으로 작동해야합니다. 또한 클래스에는 클래스 사전에 없으며 인스턴스에서 직접 액세스 할 수없는 __bases__과 같은 다른 속성이 있습니다.

+0

런타임 중에 클래스에 동적으로 설정된다는 것을 알고 있습니다. 그러나, 내 IDE (PyCharm)이 오류에 대해 불평하고있다. 형식 검사를 사용하지 않고이 문제를 방지 할 수있는 방법이 있습니까? – physicalattraction

관련 문제