将两个类写在彼此转换的单独文件中?

时间:2017-05-18 17:37:36

标签: python class import python-import

我们说我有两个文件,每个文件都有一个类。 int.py,它有一个整数类的自定义实现,float.py,它有一个float类的自定义实现。

我希望每个类都有一个转换方法到另一个。例如:

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)

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

2 个答案:

答案 0 :(得分:2)

您可以在调用方法时导入该类:

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之后不会有任何性能损失。

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

import integer

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

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

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

另一种(可能令人困惑的)替代方法是在模块之后导入类:

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将在范围内。我只记得看到实际代码中使用的前两种方法。

答案 1 :(得分:0)

只需在本地导入类:

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)

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