Django,Python和类变量

时间:2014-12-14 23:38:00

标签: python django

我在拾取Django的同时学习Python。我熟悉许多其他语言。

在以下代码段中,x是类Foo的类变量。

class Foo(object):
    x = 9000

鉴于之前的声明,以下工作正常。

print Foo.x

Django框架允许您通过定义Python类来创建模型。它使用Python类中的不同类变量创建字段。

class Question(models.Model):
    question_text = models.CharField(max_length=200)

为什么会出现以下代码段:

#!/usr/bin/env
import os, django
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
django.setup()
from polls.models import Question, Choice
print Question.question_text

抛出以下错误:

AttributeError: type object 'Question' has no attribute 'question_text'

据我所知,我的Question类定义了一个静态成员:Question.question_text

3 个答案:

答案 0 :(得分:3)

Django模型使用metaclass来改变正常的类行为。

使用dir(Question),您现在可以看到该类上有不同的属性。这只是Django模型的自定义行为。

如果您感到好奇,可以学习the metaclass __new__ method,但它会执行特定于对象关系映射任务的批次工作。

答案 1 :(得分:1)

问题是类型类型的对象。你想要一个问题实例:

>>> q= Question(text = "Does a dog have the buddha nature?")

然后你应该

  
    
      

q.text           “狗是否具有佛性?”

    
  

请注意,除非您保存(),否则此对象将不会保留:

>>> q.save()

答案 2 :(得分:0)

魔术。

不,真的。

Python类不是像C ++一样的结构。它们本身就是对象 - 另一种类型的实例:

class Foo(object):
    pass

print(type(Foo))  # <class 'type'>

您甚至可以通过调用type来创建像您这样的类来制作任何其他对象。这样:

class Bar(object):
    a = 1
    b = 2

真的(或多或少)语法糖:

Bar = type('Bar', (object,), {'a': 1, 'b': 2})

type获取新类的名称,超类列表以及类的所有属性的字典,并吐出一个新类。

但是,因为type只是一个类似于任何其他的类,所以可以将它子类化并赋予它不同的行为。这就是Django所做的:它创建了一个type的子类,它与你传递给它的属性的dict做了不同的事情。

您不会直接在自己的代码中看到这种情况,但如果您检查type(models.Model),您会发现其类型不是type,而是Django特有的内容。它可能有&#34; meta&#34;在名称中,因为它被称为元类:类的类。

这是制作&#34;声明&#34;相当常见的模式。 Python中的库,其中类的属性实际上定义了某种结构。您可以在表单验证(wtforms),模式验证(漏洞),其他ORM(sqlalchemy)甚至stdlib枚举模块中看到相同的内容。