Модели Django и атрибуты класса Python - PullRequest
6 голосов
/ 25 мая 2010

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

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

Ответы [ 4 ]

4 голосов
/ 25 мая 2010

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

setattr(self, field.attname, val)

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

1 голос
/ 25 мая 2010

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

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

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

1 голос
/ 25 мая 2010

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

0 голосов
/ 25 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...