类不应该包含创建的所有对象的列表,有什么好的理由吗?

2024-09-28 17:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

学习了很多关于python的知识。对于我的一个程序,我需要比较所有已经创建的对象,所以我把它们放在一个列表中。我想如果我创建一个包含所有创建对象的类变量,可能会更简单

这对我来说太明显了,我想知道为什么没有一直这样做,所以我想一定有一个很好的理由

比如说

class Basket:
     baskets = []
     def __init__:(self, id, volume):
          self.id = id
          self.volume = id
          baskets.append(self)

为什么不经常这样做?这似乎很明显。我的假设是,你有很好的理由不这么做,所以我很想听听


Tags: 对象self程序id列表initdefclass
1条回答
网友
1楼 · 发布于 2024-09-28 17:30:09

这是新程序员一次又一次提出的想法之一,在实践中证明是无用和适得其反的。能够管理您创建的对象很重要,但是一个由类管理的、包含该类的每个实例的单一列表在这方面做得非常糟糕

核心问题是“创建的每个对象”中的“每个”过于宽泛。实际上需要对特定类的每个实例进行操作的代码非常罕见。更常见的是,代码需要对特定代码创建的每个实例进行操作,或者对特定对象组的每个成员进行操作

使用所有实例的单一列表会使代码变得不灵活。这是一种鼓励编写代码操作“所有实例”而不是“代码关心的所有实例”的设计。当程序的范围扩展时,这种设计使得创建代码不应该关心的实例变得非常困难

另外,每个实例的列表是一个数据结构,几乎没有结构。它不表达对象之间的关系。如果在这样的列表中有两个对象,则表示“这两个对象都存在”。您很快就需要更复杂的数据结构来表示有关对象的有用信息,而一旦拥有了这些信息,类托管列表就没有任何用处了


例如,你有一个篮球课。我们没有足够的信息来判断这是购物篮还是箱子包装问题,或者是什么。“体积”表明这可能是一个箱子包装问题,所以让我们继续。我们有很多物品要打包到一个篮子里,求解者必须知道“所有篮子”,才能知道如何将物品打包到篮子里。。。除了,它真的需要知道这个问题中所有的篮子。不是整个程序中的每个Basket实例

如果你想用两套独立的篮子解决两个箱子的包装问题呢?把所有的篮子都放在一张单子上会让你很难跟踪事情的发展。如果您想同时解决两个装箱问题,可能是在两个不同的线程中,该怎么办?然后,你甚至不能在处理完一个问题后再继续处理下一个问题

如果你想写单元测试呢?这些将需要创建Basket实例。如果您有一个由类管理的所有篮子列表,那么测试将向该列表添加Basket个实例,使测试相互干扰。当一个测试运行时,列表的内容将取决于测试执行顺序。那不好。单元测试应该相互独立


考虑内置类。intdictstr,像这样的类。你有没有想过在你的整个程序或字符串中列出每一个int?这不会很有用。它会包括所有你不关心的东西,以及你甚至不知道存在的东西。来自您从未听说过的模块的随机常量,os.name,Python版权字符串等等。您甚至不知道其中的大部分来自何处。像这样的一个列表,你怎么做有用的事情呢

在较小的范围内,同样的情况也适用于您编写的类的每个实例的列表。当然,您的类不会像int这样的类那样在很多情况下使用,但是随着程序范围的扩展,您的类最终将以更多的方式使用,这些使用可能不需要相互了解。单一的实例列表本质上使类的不同使用难以避免相互干扰

相关问题 更多 >