我在拾取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
。
答案 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枚举模块中看到相同的内容。