2010-05-25 129 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它是由一個事實,即模型類有特殊的元類更加複雜,所以要小心你的假設!