为什么我必须将python包导入每个类方法?

时间:2019-12-12 15:48:47

标签: python python-import python-packaging

我有一个类对象,该对象中的某些方法需要python包(例如numpy)。如果在创建对象之前在主脚本中导入了软件包,则对象中的方法将无法识别出已导入了软件包。为了解决这个问题,我必须在方法本身中导入所有必需的包,由于该方法被调用了很多次,因此效率似乎很低。还有其他方法可以确保这些方法可以找到以前导入的软件包吗?

这是类对象:

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:未定义名称'log'”

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())

2 个答案:

答案 0 :(得分:2)

Python的导入与C或PHP样式包含的内容完全不同。 Python没有全局名称空间,每个模块(或脚本)都是它自己的名称空间,因此每个模块必须明确地导入其依赖的库。

对于您而言,解决方案很简单:在CCState.py模块中移动(或复制)所需的导入。

此外,请勿使用通配符导入(from xxx import *)-这无疑是维护噩梦的秘诀。即使lib的文档告诉您可以使用通配符,也始终使用显式导入。

最后,模块名称应为all_lower,而不是CamelCase。

答案 1 :(得分:-1)

首先,请向我们展示您脚本的内容。

如果在主脚本中导入库,则在整个文件中应该都可用。用new Vue({ el: '#app', data () { return { users: [] } }, // ADD THE CODE BELOW methods: { performGetRequest1 () { // Load the data } } } 导入另一个名为 lib.py 的python脚本与将内容从该文件​​复制到主脚本中不同。但是,您在 lib.py 中实现的库可由主脚本的方法使用。

主脚本

import lib

lib.py

from lib import *

x = [1, 2, 3]
x = numpy.array(x)

print(x)