Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型和;Python类属性_Python_Django_Attributes - Fatal编程技术网

Django模型和;Python类属性

Django模型和;Python类属性,python,django,attributes,Python,Django,Attributes,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)

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

它们是如何从类属性转变为实例属性的?我把类属性搞错了吗?

这是用元类完成的-非常聪明的东西。如果您想了解更多信息,我推荐Marty Alchin的优秀书籍Pro Django。

看看Django/db/models.py下的
Model
类。在那里,类属性通过以下方式转变为实例属性

setattr(self, field.attname, val)

可以推荐整个文件(
ModelBase
Model
类)作为元类的优秀实践示例。

在Python中,类属性始终也是实例属性:

class C(object):
    a = 1
    def show_a(self):
        print self.a # <- works
C类(对象):
a=1
def显示(自我):
打印self.a#
类实例具有名称空间
实现为一个字典,它是
属性的第一个位置
检索参考文献