【发布时间】:2015-07-13 20:14:56
【问题描述】:
我有一些使用__reduce__ 腌制的类实例。这些类有我在另一个数组中收集的成员。我需要腌制这个数组,但我找不到正确的方法。
只是为了澄清一些事情,想象一下我有代表正方形、矩形和圆形的类。我创建了一些实例:
A=Square(10)
B=Rectangle(5,10)
C=Circle(6)
我可以腌制列表
classes=[A, B, C]
但我需要一种方法来腌制这个类实例属性数组
dimensions=[A.side, B.y, C.diameter]
保留对原始对象的引用,以便如果一个对象发生更改,则相关属性会发生更改:假设我调用C.grow(2),我希望得到dimensions[2]=12。
为了解决这个问题,我现在腌制这本字典:
d={ classes: [A, B, C],
dimensions: [(A,'side'), (B,'y'), (C,'diameter')] }
但我认为这是一个非常糟糕的解决方案。
感谢任何建议。
【问题讨论】:
-
A、B和C不是类,它们是类实例。如果你有他们的列表,instances = [A, B, C],那么,即使在腌制/取消腌制之后,你应该能够访问instances[0].side、instances[1].y等。 -
您的代码难以理解,因为它不遵循PEP 8 Python 编码准则,即只大写类型名称(如
Square),但只使用小写变量名。跨度> -
@martineau 我的问题是,在 unpickling 之后,我不知道 instances 的每个项目需要什么成员......这就是为什么我也腌制 尺寸列表。
-
然后您需要以某种方式将类型信息以及实例存储在列表中,或者确保所有实例都有一个可以调用的通用方法来获取所需信息。最后,您可以使用
instance[i],__class__检查每个实例的类型以了解要访问的属性,但这不是非常面向对象的。