Как можно использовать статические переменные внутри класса Python в экземпляре класса - PullRequest
1 голос
/ 17 октября 2019

В других языках статические переменные доступны только через имя класса и вообще не относятся к экземпляру этого класса.

Я следую учебному пособию по Django Опросы . Кажется, что когда модель объявляется, поля этой модели являются статическими переменными:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

Тем не менее, учебник демонстрирует, как можно использовать оболочку Django:

>>> from polls.models import Question
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

Это действительно сбивает с толку меня, так как кажется, что мы создаем q объект типа Question, но который каким-то образом способен содержать информацию (question_test и pub_date), которая, как я думал, былаотносится только к классу, а не к экземпляру (статические переменные).

Может кто-нибудь объяснить мне, что происходит?

Как это возможно, что эти биты данных могут быть назначены на экземпляр класса? Это вещь, связанная с Python или Django? Если так, что q даже представляет? Представляет ли он просто строку в таблице?

Это довольно странно, если исходить из C ++, где статическая переменная никогда не может быть связана с объектом класса.

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Из того, что я знаю, models.Model имеет мета класс, называемый ModelBase. Таким образом, перед созданием класса Question мета класс будет активирован и присоединит атрибуты к классу. Поэтому, когда класс Question создан, у него уже есть этот атрибут и значение. Question представляет таблицу Вопрос в вашей базе данных

1 голос
/ 17 октября 2019

Класс Question представляет всю таблицу базы данных, а каждый атрибут (поле модели) класса Question представляет отдельный столбец в этой таблице.

При инициализации моделиНапример:

question1 = Question(question_text='foo', pub_date='2019-12-12')

Вы создаете экземпляр этой модели, представляющий одну строку в вашей таблице Вопросов, однако question1 не попадет в базу данных, пока вы не вызоветеэто save() метод:

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