我们说我有两个文件,每个文件都有一个类。 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)
如何将文件相互导入以使构造函数可用,而不会导致循环依赖?
答案 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)
这可以防止导入在模块加载时运行,从而避免循环导入。