【问题标题】:Object dependency remains although seemingly independent尽管看似独立,但对象依赖性仍然存在
【发布时间】:2021-01-11 04:58:08
【问题描述】:

假设我有:

  • 包 A,我们将在下面调用 BaseObjects
  • 项目 B 将 BaseObjects 作为依赖项安装并为 BaseOjects 中定义的某些类定义子类
  • 项目 C 将 BaseObjects 作为依赖项安装,但无法以任何方式访问项目 B

让我们调用BaseObjects 中定义的类之一:Point。另一个类称为Line,它采用2 个Point 实例p1p2 作为属性。

包 B 实现了一个类 PointB(Point)。因此对象PointB 也是BaseObjects.Point 的实例。

在与项目 B 相关的环境中,我创建了一个对象 Line,它使用了 2 个 PointB 对象。我使用PointB 实现的特殊方法进行各种操作。

我现在想腌制这个 Line 对象,以便它可以加载到项目 C 中。为此,我不能保留 PointB 实例。因此,我需要将它们“重新分类”为仅属于超类的类型。我做p1.__class__ = Pointp2.__class__ = Point。我检查了一下:isinstance(p1, PointB) 的计算结果为 False,与 p2 相同。

因此,我认为以这种方式腌制的对象可以从项目 C 中读取,因为它依赖于定义类 PointBaseObjects

事实并非如此。当我在项目 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


【解决方案1】:

在研究了这个问题几个小时后,我在问题中描述的内容完美无缺。我的问题出现在一个更复杂的对象中,其中许多属性引用了许多其他类。其中一个属性保持了依赖关系。这不是问题,但在此过程中学到了很多东西!

找出问题是否来自剩余依赖项的一个好方法是实现问题中描述的内容。一些极其简单的对象,它们以最简单的方式相互关联。如果该简单示例不起作用,则问题来自其他地方。如果有效,则意味着您尝试加载的对象中存在依赖项。

【讨论】:

    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2021-06-08
    • 2021-11-23
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2016-12-02
    • 2017-04-17
    相关资源
    最近更新 更多