【发布时间】:2019-02-12 01:32:45
【问题描述】:
在我当前的工作目录中,我有文件 active.ipynb,其中包含 B 类、A 的子类,并且我有 A.py,其中定义了 A。
当我在笔记本中定义所有内容时(即 A 类和 B 类都在笔记本中的一个单元格中定义),一切正常,这是我所期望的。当 A 类被移动到它自己的文件中时,我遇到了问题。在 B 类中导入数学并没有帮助,我还在与我的真实项目不同的笔记本中对此进行了测试,以确保我没有在某处做有害的事情。
考虑
A.py 内容:
#edited to reflect this issue occurring regardless of import location
import math
class A:
def method(self):
#parent related code...
self.parentmethod()
def parentmethod(self):
print(math.pi)
在我当前的单元格中,我有:
import A
class B(A.A):
def method(self):
#child related overridden code...
self.parentmethod()
b = B()
b.method()
我收到以下错误:
NameError Traceback (most recent call last)
<ipython-input-84-42c1e6969f03> in <module>
9 b = B()
10
---> 11 b.method()
<ipython-input-84-42c1e6969f03> in method(self)
5 def method(self):
6 #child related code...
----> 7 self.parentmethod()
8
9 b = B()
~\Documents\Projects\FunctionNetwork\A.py in parentmethod(self)
7
8 def parentmethod(self):
----> 9 print(math.pi)
NameError: name 'math' is not defined
发生了什么事?
【问题讨论】:
-
math在您的A.py模块中未定义,因此很明显math会引发名称错误。导入类体将创建一个类变量A.math。将导入移出类定义 -
感谢您的回复,这对我来说是一个令人尴尬的错误。我得到了静态方法和变量的想法,但对于导入语句,我并没有真正考虑太多。话虽如此,我实际上是从模块主体中的导入开始的,这就是我第一次遇到错误的地方。然后我把它移到 init 方法中(猜想我需要 self.math?),最后是类体。然而今天当我将导入移回模块时,它起作用了。去图吧。
-
没有出现在模块顶部的导入应该被认为是奇怪的。有时它是许多糟糕选项中的最佳解决方案,但通常,您应该将其视为危险信号。
标签: python inheritance module jupyter-notebook nameerror