【问题标题】:How Can Static Variables Within a Python Class Be Used in an Instance of the ClassPython 类中的静态变量如何在类的实例中使用
【发布时间】:2019-10-17 04:20:34
【问题描述】:

在其他语言中,静态变量只能通过类名访问,与该类的实例完全无关。

我一直在关注 Django Polls App Tutorial。似乎在声明模型时,该模型的字段是静态变量:

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

不过,本教程随后演示了如何使用 Django shell:

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

这真的让我感到困惑,因为我们似乎正在构造 q,一个类型为 Question 的对象,但它以某种方式能够保存信息(question_testpub_date)我以为只与类有关,与实例(静态变量)无关。

有人可以向我解释发生了什么吗?

如何将这些数据位分配给类的实例?这是与 Python 或 Django 相关的东西吗?如果是这样,q 甚至代表什么?它只代表表格中的一行吗?

这很奇怪来自 C++,其中静态变量永远不能与类的对象相关。

【问题讨论】:

  • 那是 Django ORM。在此处阅读更多信息docs.djangoproject.com/en/2.2/topics/db/models
  • 这是一个常见的误解。这些字段可通过实例访问。它们用于在创建时填充实例;请注意,您将字符串和日期作为实例变量,而不是字段类的实例。
  • @DanielRoseman,所以为了清楚起见,静态变量question_textpub_date 仅用于初始化对象q 内部的一些内部数据?这究竟是如何工作的?他们只是在对象q 中动态创建实例数据成员吗?这似乎有点奇怪,因为我假设该类将只有一个普通的__init__(self) 函数,它将声明它需要的任何内部数据成员,然后实例将获得它们自己的副本。类的静态变量在创建时变成了实例变量,这似乎有点奇怪。
  • @DanielRoseman,另外,您的评论是迄今为止回答我问题的最接近的内容,如果您要为我的问题创建答案,我可能会接受。

标签: python django


【解决方案1】:

据我所知,models.Model 有一个名为 ModelBase 的元类。因此,在创建Question 类之前,将触发元类并将属性附加到类。因此,当类Question 创建时,它已经具有该属性和值。 Question 代表数据库中的一个表 Question

【讨论】:

    【解决方案2】:

    Question 类代表一个整个数据库表,并且 Question 类的每个属性(模型字段)代表该表中的单个列。

    当你初始化一个模型时,例如:

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

    您创建该模型的 实例,它表示 Question 表中的一行,但是 question1 不会访问数据库,直到您调用它的 save() 方法:

    question1.save()
    

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多