Jupyter & Python: Почему при вызове дочернего элемента родительского метода не может быть распознан родительский метод?

В моем текущем рабочем каталоге у меня есть файлы active.ipynb, который содержит класс B, подкласс A, и у меня есть A.py, где определен A.

Когда я определяю все в записной книжке (т.е. класс A и B определяются в ячейке записной книжки), все работает нормально, чего я и ожидаю. Когда класс А перемещается в собственный файл, у меня возникают проблемы. Импорт математики в классе 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

В чем дело?

1 ответ

Решение

Я понял это, случайно повторив ошибку несколько минут назад, и теперь я могу повторить ее по своему желанию.

Я скопировал класс A из JN и случайно пропустил импорт математики на уровне модуля. Затем я импортировал класс A в новую ячейку и вызвал его метод, который привел к ошибке имени, ссылающейся на математический модуль. Это ожидается, потому что я нигде не импортировал математику.

Я добавил математический импорт в A.py, сохранил его, а затем перезапустил ячейку, предполагая, что он повторно импортирует A.py с новой информацией. Это не вариант. Когда я очистил ноутбук, только тогда он узнал, что я обновил A.py.

Очевидно, быть последовательным может быть благом, даже если вы постоянно неряшливы.

Другие вопросы по тегам