2013-05-13 1 views
4

__dict__과 같은 이유는 무엇입니까? 예 : __unicode__은 호출 가능하지 않거나 그 반대의 경우가 있습니까?__dict__이 호출 가능하지 않은 이유

장고 예를 들어, 모델의 방법으로 유니 코드 반환을 설정하는 나에게 말한다 :

class Obj(models.Model): 
    def __unicode__(self): 
     return 'hey' 

>>> x = Obj() 
<__main__.Obj object at 0x100703e10> 
>>> x.__unicode__() 
u'hello' 
>>> x.__dict__ 
{} 

그것은 이상한 불일치를 보인다, 사람이 나에게 그것을 설명 할 수 있습니까?

+6

당신은 호출 할 수있는 속성 이름을 혼동하고 있습니다. 두 사람은 연결되어 있지 않습니다. '.__ unicode__'는 속성이며 호출 할 수있는 메소드로 변환됩니다. '.__ dict__'는 속성이며 사전으로 해석됩니다. 둘 다 a * 명명 규칙 *을 사용하고, 이름 주위에 이중 밑줄이 그 이름이 예약되어 있다는 것을 의미하며 특별한 의미가 있습니다. –

+3

나는 그 질문을 이해하지 못한다. '__unicode__'는 객체의 유니 코드 표현을 원할 때마다 호출되는 메소드입니다. '__dict__'는 객체의 모든 멤버를 포함하는 속성입니다. 당신의 문제는 무엇입니까? –

+0

나는 어떤 메소드와 속성이 있는지 알고 있는데, 스타일 차이가있는 이유를 궁금해합니다. 따라서 밑줄과 밑줄은 메소드처럼 마술처럼 작동하지 않습니다. 단순히 dict을 유지하는 대신에 dict을 계산해야합니다. 뭐라구? – RabbitInAHole

답변

4

__foo__ 규칙은 Python에서 메소드와 호출 불가능 속성 모두에 사용됩니다. __unicode__은 하나의 방법이며 __dict__은 아닙니다.

+0

Ok. 글쎄, 주제에 대해, 어떻게 그리고 어디에서 __dict__를 계산합니까? – RabbitInAHole

+2

객체의 속성에 할당하는 것은'''__dict ___'''에서 속성을 설정하기위한 종합적인 설탕입니다. –

+2

@ user2378079 : 개체 생성시에 생각 하겠지만 개체 유형에 따라 달라질 수 있습니다. 예 : 클래스의'__dict__'는 실제로'dict'가 아니라'dict_proxy' 객체입니다. –

0

__dict__은 메소드가 아니라 인스턴스의 사전입니다.

+0

안녕하세요. 변경하지 않고 [제안 된 수정 사항] (http://stackoverflow.com/review/suggested-edits/2114868)을 승인하지 마십시오. – hims056

+0

그게 무슨 소리 죠? –

+0

두 번째 표를 참조하십시오. suggester가 예상 출력을 완전히 바 꾸었습니다. – hims056

관련 문제