Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中类成员和实例成员之间的差异和;“普通”;python_Python_Django_Class_Definition - Fatal编程技术网

Django中类成员和实例成员之间的差异和;“普通”;python

Django中类成员和实例成员之间的差异和;“普通”;python,python,django,class,definition,Python,Django,Class,Definition,这里是初学者问题!不久前,我问了这个问题: ,这里也有更专业的回答: 我了解到,在Python类中,基于每个对象定义的变量需要在\uuu init\uuuu(self)函数中声明 因此: class ClassOne: def __init__(self, datetime): self.datetime = datetime v = [] 变量v将为ClassOne的所有实例保存相同的数据,而对于: class ClassTwo: def __init

这里是初学者问题!不久前,我问了这个问题: ,这里也有更专业的回答:

我了解到,在Python类中,基于每个对象定义的变量需要在
\uuu init\uuuu(self)
函数中声明

因此:

class ClassOne:
    def __init__(self, datetime):
        self.datetime = datetime
    v = []
变量v将为
ClassOne
的所有实例保存相同的数据,而对于:

class ClassTwo:
    def __init__(self, datetime):
        self.datetime = datetime
        self.v = []
变量v保存
ClassTwo
的每个实例的单个数据

但是,在Django(我现在正在学习)中,我看到变量的“正常”(更类似C++)行为:

class Post(models.Model):
    title = models.CharField(max_length = 255)
这里,变量
title
保存
Post
的每个实例的单个数据,尽管未在
\uuuu init\uuu
函数中定义

我的基本问题是为什么或者为什么
标题
属于单个类对象而不是每个类对象都属于,正如
ClassOne
中的
v
在上面一样

如果我理解正确,这意味着Django类的解释不同于普通Python类?然而,这个结论没有意义

我希望有人能帮助我理解这一点。我之前的假设是,通过在Django应用程序中使用python代码的类和例程,可以将python代码(比如,数据分析或科学模型)构建到基于web的服务中。如果两个不同类的实现不同,那么这将是相当困难的


这可能在其他地方得到了回答。我不太熟悉Django jango,所以不知道要搜索什么。

title
属性不是数据。它只包含模型描述;描述
标题
字段应包含的信息类型的对象

因此,它是类别定义的一部分;
Post
类的各个实例将具有一个
title
属性,该属性符合类上的
models.CharField()
实例中设置的约束

您需要构建这样一个模型来向Django描述如何构建表单字段以及如何为
Post
实例构建SQL表;这两个概念都需要比Python本身通常需要更多的类型信息

Post
的单个实例也被赋予
标题
属性。然后,该属性会屏蔽class属性:

p = Post(title='Some title')
print p.title  # prints 'Some title'
Python首先直接查看实例;如果它没有
title
属性,则查找将移动到类对象。但是这里不需要,因为实例本身有一个
title
属性,所以找不到
Post.title
属性

顺便说一句,在Python本身中,“数据”和方法之间没有绝对的区别。Python中的一切都是对象,包括类和方法。因此,在实例上查找属性也可以在那里找到对象,包括方法。如果属性查找失败,那么Python将在类和基类上查找该属性,如果失败,查找甚至会返回元类


这就是可变属性的用武之地;在实例上查找
ClassOne().v
失败,但在类上成功。然后操纵该列表改变class属性,并再次在其他实例上查找
v
,将找到class属性。这就是类属性的共享方式,就像类上的方法一样。

Django不会更改语言的规则。然而,它确实创造性地使用了这种语言。就像
ClassTwo(…):v=[]
创建一个列表并将其存储在类中一样,
classpost(…):title=something
创建一个
something
并将其存储在类中。在本例中,所述内容不是像
“foo”
那样的字符字段值,而是表示字符字段概念的对象,最大长度为255


Django收集这些表示数据库类型的对象,并创建一个
\uuuuu init\uuuuu
方法,该方法为
Post
实例提供一个相同名称的属性(它确实包含一个实际的字符串值)。这方面的实现非常先进,但严格遵守Python语言的规则——您和我可以创建自己的Python库来执行类似的操作。无论如何,由于实例属性隐藏了类属性,所以您永远不会注意到
Post.title
只存在一次,实际上不是标题字符串<代码> AyPixObjult.Test< <代码>总是给出实例属性。

< P>作为类和实例变量之间的关系的更一般的解释,请考虑下面的与Django模型无关的示例:

>>> class A(object):
...     x = 2
...     y = 1
...
...     def __init__(self):
...         self.x = 3
... 
>>> A.x
2
>>> instance = A()
>>> instance.x 
3
>>> instance.y
1
>>> instance.y = 4
>>> instance.y
4
>>> A.y
1
我认为这里有两件事值得注意。首先,可以存在同名的单独类和实例变量。如果没有同名的实例变量,则只能从实例直接访问类变量。django模型就是这样工作的,类变量是字段(是实例变量的描述),实例变量是特定实例的值。为类和实例变量使用相同的名称可能会令人困惑,这不是一件容易做到的事情。对于django模型,我认为它工作得非常好,但仍然会引起一些头痛(我第一次使用django时也有类似的问题)

第二点需要注意的是,您可以在任何地方为实例分配变量,它不必在
\uuuu init\uuuu
函数中,甚至在实例类的方法中,它也可以在任何地方。那个