我知道在Python中模块通常只实例化一次,但是我非常希望能够达到与多次实例化同一个模块相同的效果。
作为一个最小的例子,我有 2 个文件:
classes_1.py
class my_class:
def __init__(self,x):
self.pg = __import__('put_x_get_x')
self.pg.initialise(x)
def getx(self):
return self.pg.extract_x()
主.py
from classes_1 import my_class
objs = []
objs.append(my_class(3.145))
print objs[0].getx()
objs.append(my_class(2.718))
print objs[0].getx()
print objs[1].getx()
针对哪个跑步:
$ python main.py
目前输出
3.145
2.718
2.718
但我希望它能回来
3.145
3.145
2.718
有没有办法修改classes_1.py文件来实现这一点?
我想这样做的原因是我想要实例化的真正模块实际上是一个非常大的旧 fortran 代码的包装器。模块内部有数千个需要初始化的变量,然后这些变量会更改我想要向 python 代码公开的 fortran 函数的输出。由于与后续函数调用相比,这些变量的初始化非常昂贵,因此我无法每次都重新初始化模块变量(特别是当我需要调用同一函数数百万次时)。任何有关如何实现这一最终目标的替代建议也将不胜感激。
据我所知,您不能强制Python在传统意义上多次导入模块,但您可以将模块逻辑封装在类中以管理多个独立状态,从而有效地达到预期结果。也就是说,您可以创建基于类的包装器来处理有状态行为,否则您将与多个模块实例关联。
这里是一些应该实现此目的的样板代码:
# put_x_get_x.py
class PutXGetX:
def __init__(self):
self.x = None
def initialise(self, x):
self.x = x
def extract_x(self):
return self.x
# classes_1.py
from put_x_get_x import PutXGetX
class MyClass:
def __init__(self, x):
self.pg = PutXGetX()
self.pg.initialise(x)
def getx(self):
return self.pg.extract_x()
# main.py
from classes_1 import MyClass
objs = []
objs.append(MyClass(3.145))
print(objs[0].getx()) # Output: 3.145
objs.append(MyClass(2.718))
print(objs[0].getx()) # Output: 3.145
print(objs[1].getx()) # Output: 2.718