Проблемы с Python NameError

1

У меня есть опыт программирования, но я очень новичок в python, и я пытаюсь понять, как использовать и импортировать классы из.py файлов, кроме основного. В настоящее время я использую netbeans, запуская CPython 3.2.1.

С моей настройкой прямо сейчас все мои.py файлы находятся в одной папке. Игнорируя, что такое контент на самом деле, он выглядит примерно так:

pythonprogram.py

from otherfile import *
obj = classB()
print(obj.run())

def method1():
   dostuff

otherfile.py

import pythonprogram

class classA:
   def __init__(self, thing1=None, thing2=None):
       self.thing1 = thing1
       self.thing2 = thing2
   def run():
       pythonprogram.method1()
       return something

class classB(classA):
    def __init__(self):
        super(thing1=None, thing2=None) #this will be more meaningful later
    def run():
        do some stuff
        return super().run()

Как только я доберусь до строки, где я создаю obj, я получаю следующую ошибку:

Traceback (more recent call last):
    C:\users\me\projects\pythonprogram.py in line 4 in <module>
        from room import *
    C:\users\me\projects\otherfile.py in line 4 in <module>
        import pythonprogram
    C:\users\me\projects\pythonprogram.py in line 13 in <module>
        obj = classB()

Будучи незнакомым с питоном, кто-то может захотеть сообщить мне, правильно ли я использую супер, теперь, когда я об этом думаю, но это не так (и это, конечно, не ошибка, с которой я имею дело прямо сейчас).

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

В противном случае, я просто хотел бы знать, что я делаю неправильно, с точки зрения того, как я все настраивал, и как я должен его исправлять.

Если это помогает, я сначала научился в Java и могу использовать С# и C++.

Теги:
nameerror
cpython

3 ответа

2

Ваша проблема вызвана циклическим импортом. Python менее гибкий, чем некоторые другие языки в этом отношении, из-за последовательного способа определения вещей. В вашем случае, pythonprogram требует classB от otherfile до того method1 может быть определена. Но otherfile требует method1 перед тем classB может быть определен!

Иногда вы можете разрешать циклический импорт, перемещая линии import дальше модуля. Но лучший способ решить это - полностью избежать двунаправленных зависимостей между модулями. Обычно это приводит к более чистым и более совершенным программам.

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

Если вы хотите использовать pythonprogram.py в качестве модуля, вы можете изменить его следующим образом:

from otherfile import *

def method1():
   print "dosomthing"

if __name__ == "__main__":
    obj = classB()
    print(obj.run())

при запуске pythonprogram.py имя условия == " main " будет сохранено, когда вы импортируете pythonprogram из другого модуля, имя == " main " будет false.

  • 0
    Это решило мою проблему. Спасибо!
0

На этом самом базовом уровне вы пытаетесь вызвать method1() прежде чем определили его.

По сути, вы вызываете classB, который, в свою очередь, вызывает classA, который пытается вызвать method1, но вы делаете это первое, classB() в строке до того, как будет определен method.

Самый простой выход из этого беспорядка - просто переместить все, кроме части вашего кода, которая на самом деле делает материал до самого конца файла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню