【发布时间】:2015-04-10 23:29:51
【问题描述】:
我正在尝试学习如何为运行模拟的科学计算进行面向对象的编码;我正在使用 numpy 等。我创建了我的第一个类 WC_unit,它位于 ./classes/WC_class.py(一个子目录)。我在classes 目录中创建了一个__init__.py 文件(为空)。
WC_unit 类的方法需要一些 numpy 函数,例如 exp
当我从终端运行代码(在 ipython 中)时,使用
%run WC_class.py
我可以生成E1 = WC_unit() 类的实例,我可以在上面运行相关的方法,即E1.update()
我真的无法判断它是否有效。我在位于的脚本test.py 中编写了一些外部代码。 (以上./classes)来测试我正在生成的对象,我正在尝试使用
from classes.WC_class import WC_unit
现在,当我创建类的实例 E1 并运行 E1.update() 时,我收到错误消息 global name 'exp' is not defined。
我尝试调用from numpy import * 或import numpy as np 并将函数调用更改为np.exp(),但我继续收到错误消息。考虑到我有某种范围界定问题或命名空间问题,我已将相同的导入函数放在不同位置,包括test.py 文件、类文件顶部WC_class.py,甚至在方法中:
class WC_unit:
def __init__(self): [assign default pars from a dict including r, dt, tau, and Iapp]...
def update(self):
from numpy import *
self.r += self.dt/self.tau * (-self.r + exp(self.Iapp))
我真的很想提高自己的水平,弄清楚如何编写自己的类并将它们与出色的计算工具一起使用。我想我想知道:
我做错了什么(可能很多,我怀疑)。我认为这与我导入课程的方式有关?但也可能在课程本身中进行范围界定。
为什么当我
import我的班级无法访问 numpy 函数,但当我像终端中的脚本一样运行它时却没有?我想我一般也不明白为什么人们如此保护他们的命名空间,即为什么这么多代码示例显示
import numpy as np并使用所有函数作为np.exp(x)等等。我不明白'没有太多的计算机科学背景,所以我可以从你提供的任何解释中受益匪浅——文档对我来说有点神秘。
Python 版本:2.7.8 |Anaconda 2.1.0 (x86_64)| (默认,2014 年 8 月 21 日,15:21:46) [GCC 4.2.1 (Apple Inc. build 5577)] 在 Mac OSX 10.6.8 上
【问题讨论】:
-
停止使用
from numpy import *并更喜欢import numpy并使用numpy.array、numpy.mean等。这样可以防止命名空间污染,从而造成您所看到的问题。 -
请始终为您的问题中的任何错误消息显示完整的回溯