[英]Django, Python, and Class Variables
我在学习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
。
Django模型使用元类来更改正常的类行为。
使用dir(Question)
,您将看到该类上现在有不同的属性。 但是,这是仅针对Django模型的自定义行为。
如果您好奇,可以研究元类__new__
方法 ,但是它做了很多特定于对象关系映射任务的工作。
问题是类型类型的对象。 您想要一个Question实例:
>>> q= Question(text = "Does a dog have the buddha nature?")
那你应该得到
q.text“狗具有佛性吗?”
请注意,除非将其保存(),否则该对象将不会持久存在:
>>> q.save()
魔法。
不完全是。
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
只是一个与其他type
一样的类,因此可以将其子类化并赋予其不同的行为。 这就是Django所做的:创建一个type
的子类,该子类与传递给它的属性的用法有所不同。
您不会在自己的代码中直接看到这种情况,但是如果检查type(models.Model)
,您会发现它的类型不是type
,而是特定于Django的东西。 它的名称中可能带有“元”,因为它称为元类 :类的类。
这是在Python中制作“声明式”库的相当普遍的模式,其中类的属性实际上定义了某种结构。 您可以在表单验证(wtforms),模式验证(colander),其他ORM(sqlalchemy)甚至stdlib枚举模块中看到相同的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.