在相互转换的单独文件中写入两个 类?
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)
这可以防止在模块加载时导入 运行,从而避免循环导入。
假设我有两个文件,每个文件中都有一个 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)
这可以防止在模块加载时导入 运行,从而避免循环导入。