2013-05-13 118 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

相关问题