为什么我必须将 python 包导入到每个 class 方法中?
Why do I have to import python packages into each class method?
我有一个 class 对象,对象中的一些方法需要 python 包(例如 numpy)。如果我在创建对象之前在主脚本中导入包,则对象中的方法无法识别包是否已导入。为了解决这个问题,我必须在方法本身中导入所有必要的包,这似乎很低效,因为该方法被多次调用。有没有其他方法可以确保方法可以找到以前导入的包?
这是 class 对象:
class CCState:
def __init__(self, stateVector = None):
self.fill_vol = 0
self.headspace_vol = 0
self.temperature = 0
self.pressure = 0
self.flowin = 0
self.flowout = 0
self.product = 0
self.viacell_attach = 0
self.viacell_suspend = 0
self.deadcell_attach = 0
self.deadcell_suspend = 0
self.headspace_temperature = 0
self.hdgas_o2 = 0
self.hdgas_n2 = 0
self.hdgas_co2 = 0
self.hdgas_ar = 0
self.dsg_o2 = 0
self.dsg_n2 = 0
self.dsg_co2 = 0
self.dsg_ar = 0
self.glucose = 0
self.glutamine = 0
self.glutamate = 0
self.lacticacid = 0
self.lactate = 0
self.ammonia = 0
self.ammonium = 0
self.bicarbonate = 0
self.carbonate = 0
self.cation = 0
self.proton = 0
self.anion = 0
self.hepes = 0
self.hepesion = 0
self.hydroxyl = 0
self.microcarrier = 0
self.antifoam = 0
self.sulfite = 0
self.rDTT = 0
self.oDTT = 0
self.promoter = 0
self.sulfiteacid = 0
self.sulfate = 0
self.bisulfite = 0
self.fudgeacid = 0
self.fudgeanion = 0
self.fudgebase = 0
self.fudgecation = 0
self.viacell_attach2 = 0
self.serum = 0
self.tris = 0
self.triscation = 0
self.aceticacid =0
self.acetate = 0
self.h3po4 = 0
self.dihydrogenphosphate = 0
self.hydrogenphosphate = 0
self.phosphate = 0
self.names = [i for i in self.__dict__.keys() if i[:1] != '_']
# If a vector has been passed, assign all parameters to values in the vector
if stateVector is not None:
for iName in range(0,len(self.names)):
setattr(self,self.names[iName],stateVector[iName])
def pH(self):
"""Return pH"""
#from math import log
return -log(max(10E-14, self.proton)*0.001,10);
如果我运行这个代码我得到错误"NameError: name 'log' is not defined"
from helper_functions import *
from scipy.integrate import ode
from math import exp, log
from scipy import interpolate
import numpy as np
from numpy.linalg import norm
from CCState import *
import chemical_reaction_model
import time
temp = CCState()
print(temp.pH())
首先,请向我们展示您的脚本内容。
如果您在主脚本中导入库,它应该在整个文件中可用。使用 import lib
导入名为 lib.py 的第二个 python 脚本与将内容从该文件复制到主脚本中不同。但是,您在 lib.py 中实现的库可以由您的主脚本的方法使用。
主脚本
from lib import *
x = [1, 2, 3]
x = numpy.array(x)
print(x)
lib.py
import numpy
Python 的导入与 C 或 PHP 风格的包含完全不同。 Python 没有全局命名空间,每个模块(或脚本)都是它自己的命名空间,因此每个模块必须显式 导入它所依赖的库。
对于您的情况,解决方案很简单:在您的 CCState.py 模块中移动(或复制)所需的导入。
此外,请勿使用通配符导入 (from xxx import *
) - 这肯定会导致维护噩梦。始终使用显式导入,即使 lib 的文档告诉您可以使用通配符。
最后,模块名称应该是 all_lower,而不是 CamelCase。
我有一个 class 对象,对象中的一些方法需要 python 包(例如 numpy)。如果我在创建对象之前在主脚本中导入包,则对象中的方法无法识别包是否已导入。为了解决这个问题,我必须在方法本身中导入所有必要的包,这似乎很低效,因为该方法被多次调用。有没有其他方法可以确保方法可以找到以前导入的包?
这是 class 对象:
class CCState:
def __init__(self, stateVector = None):
self.fill_vol = 0
self.headspace_vol = 0
self.temperature = 0
self.pressure = 0
self.flowin = 0
self.flowout = 0
self.product = 0
self.viacell_attach = 0
self.viacell_suspend = 0
self.deadcell_attach = 0
self.deadcell_suspend = 0
self.headspace_temperature = 0
self.hdgas_o2 = 0
self.hdgas_n2 = 0
self.hdgas_co2 = 0
self.hdgas_ar = 0
self.dsg_o2 = 0
self.dsg_n2 = 0
self.dsg_co2 = 0
self.dsg_ar = 0
self.glucose = 0
self.glutamine = 0
self.glutamate = 0
self.lacticacid = 0
self.lactate = 0
self.ammonia = 0
self.ammonium = 0
self.bicarbonate = 0
self.carbonate = 0
self.cation = 0
self.proton = 0
self.anion = 0
self.hepes = 0
self.hepesion = 0
self.hydroxyl = 0
self.microcarrier = 0
self.antifoam = 0
self.sulfite = 0
self.rDTT = 0
self.oDTT = 0
self.promoter = 0
self.sulfiteacid = 0
self.sulfate = 0
self.bisulfite = 0
self.fudgeacid = 0
self.fudgeanion = 0
self.fudgebase = 0
self.fudgecation = 0
self.viacell_attach2 = 0
self.serum = 0
self.tris = 0
self.triscation = 0
self.aceticacid =0
self.acetate = 0
self.h3po4 = 0
self.dihydrogenphosphate = 0
self.hydrogenphosphate = 0
self.phosphate = 0
self.names = [i for i in self.__dict__.keys() if i[:1] != '_']
# If a vector has been passed, assign all parameters to values in the vector
if stateVector is not None:
for iName in range(0,len(self.names)):
setattr(self,self.names[iName],stateVector[iName])
def pH(self):
"""Return pH"""
#from math import log
return -log(max(10E-14, self.proton)*0.001,10);
如果我运行这个代码我得到错误"NameError: name 'log' is not defined"
from helper_functions import *
from scipy.integrate import ode
from math import exp, log
from scipy import interpolate
import numpy as np
from numpy.linalg import norm
from CCState import *
import chemical_reaction_model
import time
temp = CCState()
print(temp.pH())
首先,请向我们展示您的脚本内容。
如果您在主脚本中导入库,它应该在整个文件中可用。使用 import lib
导入名为 lib.py 的第二个 python 脚本与将内容从该文件复制到主脚本中不同。但是,您在 lib.py 中实现的库可以由您的主脚本的方法使用。
主脚本
from lib import *
x = [1, 2, 3]
x = numpy.array(x)
print(x)
lib.py
import numpy
Python 的导入与 C 或 PHP 风格的包含完全不同。 Python 没有全局命名空间,每个模块(或脚本)都是它自己的命名空间,因此每个模块必须显式 导入它所依赖的库。
对于您的情况,解决方案很简单:在您的 CCState.py 模块中移动(或复制)所需的导入。
此外,请勿使用通配符导入 (from xxx import *
) - 这肯定会导致维护噩梦。始终使用显式导入,即使 lib 的文档告诉您可以使用通配符。
最后,模块名称应该是 all_lower,而不是 CamelCase。