2010-05-25 14 views
6

Il tutorial sul sito Django mostra questo codice per i modelli:modelli Django e Python attribuisce

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() 

Ora, ciascuno di questi attributi, è un attributo di classe, giusto? Quindi, lo stesso attributo dovrebbe essere condiviso da tutte le istanze della classe. Un po 'più tardi, presentano questo codice:

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

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

Come sono passati dagli attributi di classe agli attributi di istanza? Ho sbagliato gli attributi di classe?

risposta

4

Dai un'occhiata alla classe Model in django/db/models.py. Ci gli attributi della classe sono rivolti ad esempio attributi via qualcosa come

setattr(self, field.attname, val) 

Uno potrebbe raccomandare l'intero file (ModelBase e Model classe) come un ottimo esempio hands-on su metaclassi.

1

E 'fatto con metaclassi - roba molto intelligente. Consiglio l'eccellente libro di Marty Alchin Pro Django se vuoi saperne di più.

1

In Python, un attributo di classe è sempre anche un attributo esempio:

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

Ma in Django si è ulteriormente complicato dal fatto che le classi del modello hanno metaclassi speciali, quindi state attenti alle vostre ipotesi!