У меня есть опыт программирования, но я очень новичок в 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++.
Ваша проблема вызвана циклическим импортом. Python менее гибкий, чем некоторые другие языки в этом отношении, из-за последовательного способа определения вещей. В вашем случае, pythonprogram
требует classB
от otherfile
до того method1
может быть определена. Но otherfile
требует method1
перед тем classB
может быть определен!
Иногда вы можете разрешать циклический импорт, перемещая линии import
дальше модуля. Но лучший способ решить это - полностью избежать двунаправленных зависимостей между модулями. Обычно это приводит к более чистым и более совершенным программам.
Если вы хотите использовать pythonprogram.py в качестве модуля, вы можете изменить его следующим образом:
from otherfile import *
def method1():
print "dosomthing"
if __name__ == "__main__":
obj = classB()
print(obj.run())
при запуске pythonprogram.py имя условия == " main " будет сохранено, когда вы импортируете pythonprogram из другого модуля, имя == " main " будет false.
На этом самом базовом уровне вы пытаетесь вызвать method1()
прежде чем определили его.
По сути, вы вызываете classB
, который, в свою очередь, вызывает classA
, который пытается вызвать method1
, но вы делаете это первое, classB()
в строке до того, как будет определен method
.
Самый простой выход из этого беспорядка - просто переместить все, кроме части вашего кода, которая на самом деле делает материал до самого конца файла.