【发布时间】:2021-01-11 04:58:08
【问题描述】:
假设我有:
- 包 A,我们将在下面调用
BaseObjects - 项目 B 将
BaseObjects作为依赖项安装并为BaseOjects中定义的某些类定义子类 - 项目 C 将
BaseObjects作为依赖项安装,但无法以任何方式访问项目 B
让我们调用BaseObjects 中定义的类之一:Point。另一个类称为Line,它采用2 个Point 实例p1 和p2 作为属性。
包 B 实现了一个类 PointB(Point)。因此对象PointB 也是BaseObjects.Point 的实例。
在与项目 B 相关的环境中,我创建了一个对象 Line,它使用了 2 个 PointB 对象。我使用PointB 实现的特殊方法进行各种操作。
我现在想腌制这个 Line 对象,以便它可以加载到项目 C 中。为此,我不能保留 PointB 实例。因此,我需要将它们“重新分类”为仅属于超类的类型。我做p1.__class__ = Point 和p2.__class__ = Point。我检查了一下:isinstance(p1, PointB) 的计算结果为 False,与 p2 相同。
因此,我认为以这种方式腌制的对象可以从项目 C 中读取,因为它依赖于定义类 Point 的 BaseObjects。
事实并非如此。当我在项目 C 中加载 pickle 文件时,它会查找我在项目 B 中定义子类的文件夹。但是,当我挖掘对象时,我没有找到任何链接。据说所有对象的类型都是BaseObjects.<class_name>
在我摆脱这个对象对项目 B 的依赖的过程中出了什么问题?有没有办法查看一个对象的所有依赖关系?
【问题讨论】:
-
通常在 python 中的“转换”是通过使用一个构造函数来完成的,该构造函数接受一个类的实例。在您的情况下:
Point(point_b)。更改__class__有点笨拙。另请参阅:stackoverflow.com/a/9112513/14157562 -
@Wups 但是强制转换会更改对象地址,并且所有相关对象都会丢失对它的引用。使用
__class__允许我保持对该对象的所有引用有效。 -
我可能没有使用正确的术语,似乎它被称为“重新分类”,从stackoverflow.com/questions/990758/… 看来是可以接受的事情我正在编辑我的问题。
-
当然。我的建议只有在 Line 是唯一引用点对象的对象时才有意义。
标签: python oop object dependencies