Учебное руководство на django веб-сайте показывает этот код для моделей:
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
Как они поворачивались от атрибутов класса в атрибуты экземпляра? Я понимал атрибуты класса превратно?
Взгляните на класс Model
в django / db / models.py. Здесь атрибуты класса превращаются в атрибуты экземпляра с помощью чего-то вроде
setattr(self, field.attname, val)
. Можно порекомендовать весь файл ( ModelBase
и Model
класс) в качестве отличного практического примера метаклассов.
Это сделано с помощью метаклассов - очень умная вещь. Я бы рекомендовал отличную книгу Марти Алчина Pro Django, если вы хотите узнать больше.
В Python атрибут класса всегда также является атрибутом экземпляра:
class C(object):
a = 1
def show_a(self):
print self.a # <- works
Но в django он еще больше осложняется тем, что классы Model имеют специальные метаклассы, поэтому будьте осторожны со своими предположениями!
У экземпляра класса есть пространство имен. реализованное в виде словаря, который является первым местом, в котором ищутся ссылки на атрибуты.