在相互转换的单独文件中写入两个 类?

Writing two classes in separate files that have conversions to each other?

假设我有两个文件,每个文件中都有一个 class。 int.py 具有整数 class 的自定义实现,float.py 具有浮点数 class.

的自定义实现

我希望每个 class 都有一个相互转换的方法。例如:

class Integer:   
  def __init__(self, value):
    self.value = value

  def to_f():
    return Float(self.value)

class Float:   
  def __init__(self, value):
    self.value = value

  def to_i():
    return Integer(self.value)

如何将文件相互导入以便构造函数可用,而不会导致循环依赖?

调用方法时可以导入class:

class Float:   
  def __init__(self, value):
    self.value = value

  def to_i(self):
    from integer import Integer
    return Integer(self.value)

导入缓存在 sys.modules 中,因此除了第一次调用 Float.to_i 之外不会有任何性能损失。


另一种方法是导入模块本身并查找 class:

import integer

class Float:   
  def __init__(self, value):
    self.value = value

  def to_i(self):
    return integer.Integer(self.value)

只要没有模块级的循环依赖(比如 integer 中的 subclassing Float),你就不会有任何问题。


还有一个(可能令人困惑的)替代方法是在模块之后导入 classes:

class Float:   
  def __init__(self, value):
    self.value = value

  def to_i(self):
    return Integer(self.value)


from integer import Integer

调用 Float.to_i 时,Integer 将在范围内。我只记得在实际代码中看到过前两种方法。

只需在本地导入 类:

class Float:  
  def to_i():
    from .int import Integer  # not run at module loading time
    return Integer(self.value)

class Integer:   
  def to_f():
    from .float import Float
    return Float(self.value)

这可以防止在模块加载时导入 运行,从而避免循环导入。