【问题标题】:Jupyter & Python: Why can't a child's call to a parent method recognize the parent's import?Jupyter & Python:为什么孩子对父方法的调用不能识别父方法的导入?
【发布时间】: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


【解决方案1】:

我刚才不小心重复了错误,现在我可以随意复制它了。

我从 JN 复制了 A 类,但不小心错过了模块级别的数学导入。然后我将 A 类导入一个新的单元格并调用它的方法,这会导致引用数学模块的名称错误。这是意料之中的,因为我没有在任何地方导入数学。

我将数学导入添加到 A.py,保存它,然后重新运行单元格,假设它将使用新信息重新导入 A.py。不是这种情况。当我清除笔记本时,它才意识到我更新了A.py。

显然,即使你一直马虎,保持一致也能带来好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2021-04-08
    相关资源
    最近更新 更多