python - Jupyter & Python:为什么孩子对父方法的调用不能识别父方法的导入?
问题描述
在我当前的工作目录中,我有文件 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
这是怎么回事?
解决方案
我刚才不小心重复了错误,现在我可以随意复制它了。
我从 JN 复制了 A 类,不小心错过了模块级别的数学导入。然后我将 A 类导入一个新的单元格并调用它的方法,这会导致引用数学模块的名称错误。这是意料之中的,因为我没有在任何地方导入数学。
我将数学导入添加到 A.py,保存它,然后重新运行单元格,假设它将使用新信息重新导入 A.py。不是这种情况。当我清除笔记本时,它才意识到我更新了 A.py。
显然,即使你一直马虎,保持一致也可能是一件好事。
推荐阅读
- postgresql - 我如何在 postgres 中找到 LOCALITY、PARTITIONED、UNIQUENESS 的详细信息,就像我们从 oracle 的 USER_PART_INDEXES 获得的一样
- php - 如何在 PHP SOAP 客户端的标头内设置参数
- c# - Prepare() 方法的正确位置是什么?在定义参数(及其类型和大小)之前还是之后?
- c# - 将旧的异步模式包装到 TaskCompletionSource 时返回等待?
- c# - 无法转换为类型 'MongoDB.Bson.Serialization.IBsonSerializer`1[System.String]'
- r - Shiny:如何在日志中打印更新对象的名称?
- javascript - 从子函数调用时反应父属性函数不触发
- typo3 - 如何在打字稿中启用 showPermaLogin?
- scala - Scala 的 mutable.ListBuffer 似乎使用了 List 的 tail 函数,但它被记录为具有线性复杂性?
- html - 如何为矩形的对角线设置动画?