簡體   English   中英

Django模型和Python類屬性

[英]Django models & Python class 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)
    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

他們是如何從類屬性轉變為實例屬性的? 我的課程屬性錯了嗎?

看看django / db / models.py下的Model類。 在那里,類屬性通過類似的東西轉向實例屬性

setattr(self, field.attname, val)

有人可能會推薦整個文件( ModelBaseModel類)作為元類的優秀動手示例。

這是用元類完成的 - 非常聰明的東西。 如果你想了解更多,我會推薦Marty Alchin的優秀書籍Pro Django。

在Python中,類屬性始終也是實例屬性:

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

但是在django中,由於Model類有特殊的元類,所以要進一步復雜化,所以要小心你的假設!

類實例具有作為字典實現的名稱空間,該字典是搜索屬性引用的第一個位置。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM