繁体   English   中英

Django,Python和类变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM