2010-05-25 83 views
6

Django的网站上的教程演示了此代码为车型:Django模型和Python的类属性

from django.db import models 

class Poll(models.Model): 
    question = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 

class Choice(models.Model): 
    poll = models.ForeignKey(Poll) 
    choice = models.CharField(max_length=200) 
    votes = models.IntegerField() 

现在,每次这些属性,是一个类属性,对不对?所以,同一个属性应该被该类的所有实例共享。稍后,他们介绍此代码:

class Poll(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.question 

class Choice(models.Model): 
    # ... 
    def __unicode__(self): 
     return self.choice 

他们是如何从类属性转变为实例属性的?我的课程属性错了吗?

回答

4

看看django/db/models.py下的Model类。有阶级属性转向例如通过一些属性,如

setattr(self, field.attname, val) 

有人可能会建议将整个文件(ModelBaseModel类)作为一个优秀的动手例如在元类。

1

它是用元类完成的 - 非常聪明的东西。如果你想了解更多信息,我会推荐Marty Alchin的优秀书籍Pro Django。

1

在Python中,类属性始终也是一个实例属性:

class C(object): 
    a = 1 
    def show_a(self): 
     print self.a # <- works 

但在Django它是由一个事实,即模型类有特殊的元类更加复杂,所以要小心你的假设!