Модели Django и атрибуты класса Python

Учебное руководство на 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

Как они поворачивались от атрибутов класса в атрибуты экземпляра? Я понимал атрибуты класса превратно?

6
задан Geo 25 May 2010 в 10:06
поделиться

4 ответа

Взгляните на класс Model в django / db / models.py. Здесь атрибуты класса превращаются в атрибуты экземпляра с помощью чего-то вроде

setattr(self, field.attname, val)

. Можно порекомендовать весь файл ( ModelBase и Model класс) в качестве отличного практического примера метаклассов.

4
ответ дан 17 December 2019 в 02:24
поделиться

Это сделано с помощью метаклассов - очень умная вещь. Я бы рекомендовал отличную книгу Марти Алчина Pro Django, если вы хотите узнать больше.

1
ответ дан 17 December 2019 в 02:24
поделиться

В Python атрибут класса всегда также является атрибутом экземпляра:

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

Но в django он еще больше осложняется тем, что классы Model имеют специальные метаклассы, поэтому будьте осторожны со своими предположениями!

1
ответ дан 17 December 2019 в 02:24
поделиться

У экземпляра класса есть пространство имен. реализованное в виде словаря, который является первым местом, в котором ищутся ссылки на атрибуты.

http://docs.python.org/reference/datamodel.html

0
ответ дан 17 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: