gpt4 book ai didi

python - Django 和 "Ordinary"Python 类成员和实例成员的区别?

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:05 24 4
gpt4 key购买 nike

初学者问题在这里!前段时间,我问了这个问题: Parse CSV records into a list of Classes ,这里也有更技术性的回答:How do I avoid having class data shared among instances?

我了解到,在 Python 类中,将在每个对象的基础上定义的变量需要在 __init__(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每个实例的个人数据 ,尽管未在 __init__ 中定义功能。

我的基本问题是为什么如何 title属于个别类对象,而不是每个类对象,如vClassOne以上是?

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

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

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

最佳答案

title 属性不是数据。它仅包含模型描述;一个对象描述 title 字段应该包含什么类型的信息。

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

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

Post 的个别实例也被赋予title 属性。然后该属性屏蔽了类属性:

p = Post(title='Some title')
print p.title # prints 'Some title'

Python先直接看实例;如果它具有title 属性,则查找将移至类对象。但这里不需要,Post.title 属性未找到,因为实例本身具有 title 属性。

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

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

关于python - Django 和 "Ordinary"Python 类成员和实例成员的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20870059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com