2013-05-13 157 views
4

爲什麼__dict__和例如__unicode__不能同時調用或反過來?爲什麼不__dict__可以被調用

的Django告訴我設置一個Unicode回報的方法上的型號,例如:

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 *命名約定*,雙名字在名稱信號中強調名稱是保留的,並且具有特殊含義。 – 2013-05-13 15:14:05

+3

我不明白這個問題。 '__unicode__'是一種當你想要一個對象的unicode表示的時候被調用的方法。 '__dict__'是一個包含對象所有成員的屬性。你的問題是什麼? – 2013-05-13 15:14:21

+0

我知道什麼方法和屬性,我想知道爲什麼有一個風格的差異,因此雙下劃線,並不像操作一樣的方法操作一些魔術,而不是簡單地舉行一個字典,我的意思是字典必須進行計算somehwere? – RabbitInAHole 2013-05-13 15:15:33

回答

4

__foo__約定用於Python中的方法和非可調用屬性。 __unicode__是一種方法,__dict__不是。

+0

好了,所以兩者都可以,這就解釋了。那麼不是真的關於主題,但__dict__如何以及在哪裏計算? – RabbitInAHole 2013-05-13 15:19:45

+2

分配給對象的屬性只是用於在其'__dict ___'''中設置屬性的合成糖。 – 2013-05-13 15:23:04

+2

@ user2378079:我想在創建對象時,它可能取決於對象的類型。例如。一個類的'__dict__'實際上是一個'dict_proxy'對象,而不是一個'dict'。 – 2013-05-13 15:25:05

0

__dict__是實例的字典,而不是方法。

+0

嗨。請不要批准[建議的修改](http://stackoverflow.com/review/suggested-edits/2114868),而不要看到更改。 – hims056 2013-05-15 04:44:04

+0

你在說什麼? – 2013-05-15 04:46:28

+0

查看第二個表格。建議者完全改變了預期的輸出 – hims056 2013-05-15 04:47:35

相關問題