我正在创建一个快速的数值求解器,其中所有变量在不同文件之间共享。因此,项目中的所有文件都必须访问包含变量的对象。
这是一个求解拉普拉斯方程的数值应用程序。不幸的是,我的经验基本上是关于Fortran90和MPI的,而没有关于OOP的经验。我想使每个文件上的每个“子例程”保持隔离。这就是我在CFD中用程序开发数千行代码的方法。我想对对象使用相同的想法。
file1.py
class Variables:
def __init__():
self.AnodeLength = 2.0
self.CathodeLength = 1.0
self.Length = 0.0
......
# a bunch of more variables
file2.py
from file1 import *
ME = Variables()
# ME is the object from the class Variables from file1.py and it contains all the variables needed for the computation.
GridSolver = Grid()
GridSolver.GridGeneration #Here is the problem
file3.py
from file2 import *
class Grid:
def GridGeneration(self):
EM.Length = EM.AnodeLength + EM.CathodeLength
当我执行前面的代码时,它给了我EM错误,无法识别。我认为这是有道理的,因为EM不在该类的范围内,而是在我启动的file2.py中。
是否可以将对象作为参数传递给类?例如,如果我可以将对象EM传递到Grid类中,则可以从Grid类中的该对象中提取属性,我想可以解决我的问题。
是否可以使对象成为全局对象,以便同一目录中的每个类(来自每个文件)都可以访问该对象?
答案 0 :(得分:0)
根据您当前的方法,可以将对象作为参数传递给类。您更新后的代码如下所示:
file1.py
class Variables:
def __init__():
self.AnodeLength = 2.0
self.CathodeLength = 1.0
self.Length = 0.0
......
# a bunch of more variables
file2.py
from file1 import *
ME = Variables()
# ME is the object from the class Variables from file1.py and it contains all the variables needed for the computation.
GridSolver = Grid()
GridSolver.GridGeneration(ME) #Passing the object as parameter
file3.py
from file2 import *
class Grid:
def GridGeneration(self, EM):
EM.Length = EM.AnodeLength + EM.CathodeLength
如您所见,我们将GridGeneraion更改为接受其他参数。 现在,让我向您展示所有标准模块使用常量的方式。
file1.py
ANODE_LENGTH = 2.0
CATHODE_LENGTH = 1.0
LENGTH = 0.0
# a bunch of more variables
file2.py
GridSolver = Grid()
GridSolver.GridGeneration() # no need to pass parameter
file3.py
import file1
class Grid:
def GridGeneration(self):
EM.Length = file1.ANODE_LENGTH + file1.CATHODE_LENGTH
上面的代码有任何问题,任何人都可以将值分配给这些常量。因此在python中,没有常量。这意味着任何人都可以更改ANODE_LENGTH=100
这样的值。虽然,您可以基于this post
因此您的 file2.py 实现将更改如下
class _file2:
class ConstError(TypeError): pass
def __setattr__(self,name,value):
if self.__dict__.has_key(name):
raise self.ConstError, "Can't rebind const(%s)"%name
self.__dict__[name]=value
import sys
sys.modules[__name__]=_file2()