Swi*_*row 7 python django class definition
初学者问题在这里!前段时间,我问了这个问题: Parse CSV records into a list of Classes,这里也有更技术性的回答:如何避免在实例之间共享类数据?
我了解到,在 Python 类中,需要在__init__(self)函数中声明将基于每个对象定义的变量。
因此对于:
class ClassOne:
def __init__(self, datetime):
self.datetime = datetime
v = []
Run Code Online (Sandbox Code Playgroud)
变量v将持有的所有实例相同数据的ClassOne,而对于:
class ClassTwo:
def __init__(self, datetime):
self.datetime = datetime
self.v = []
Run Code Online (Sandbox Code Playgroud)
变量 v 保存的每个实例的单独数据ClassTwo。
但是,在 Django(我现在正在学习)中,我再次看到变量的“正常”(更像 C++)行为:
class Post(models.Model):
title = models.CharField(max_length = 255)
Run Code Online (Sandbox Code Playgroud)
此处,变量title保存的每个实例的单独数据Post,尽管未在__init__函数中定义。
我的基本问题是,为什么或如何不title属于个人类对象的而不是常见到每一个类的对象,如v在ClassOne以上?
如果我理解正确,这意味着 Django 类的解释与普通 Python 类不同吗?然而,这个结论没有意义......
我希望有人能帮助我理解这一点。我之前假设 Python 代码(例如,数据分析或科学模型)可以通过在 Django 应用程序中使用它的类和例程来构建到基于 Web 的服务中。如果两个不同的类的实现不同,那么这将是相当困难的!
这可能在别处得到了回答。我不精通 Django jango,所以不知道要搜索什么。
该title属性不是 data。它仅包含模型描述;一个对象,描述该title字段应该包含什么类型的信息。
因此,它是类定义的一部分;类的各个实例Post将具有title符合models.CharField()在类的实例中设置的约束的属性。
您需要构建这样一个模型,向Django 描述如何构建表单字段以及如何为Post实例构建SQL 表;这两个概念都需要比 Python 本身通常需要的类型信息更多的类型信息。
个别情况下,Post被赋予了title属性也。该属性然后屏蔽类属性:
p = Post(title='Some title')
print p.title # prints 'Some title'
Run Code Online (Sandbox Code Playgroud)
Python首先直接查看实例;如果它不具有title的属性,查找就再移动到类对象。但是这里不需要,Post.title因为实例title本身有一个属性,所以找不到该属性。
顺便说一下,在 Python 本身中,“数据”和方法之间没有绝对的区别。Python 中的一切都是对象,包括类和方法。因此,查找实例上的属性也可以在那里找到一个对象,包括 methods。如果那里的属性查找失败,那么 Python 将在类和基类上查找属性,如果失败,查找甚至会回退到元类。
这就是可变属性的用武之地;ClassOne().v在实例上查找失败,但在类上查找成功。操纵该名单随后会改变ClassOne.v类的属性,并查找v在其他情况下,再次将发现类属性。这就是类属性的共享方式,就像类上的方法一样。