Проблемы с Python NameError - PullRequest
       7

Проблемы с Python NameError

1 голос
/ 11 августа 2011

У меня есть некоторый опыт программирования, но я очень плохо знаком с 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, кто-то, возможно, захочет сообщить мне, правильно ли я использую super, теперь, когда я об этом думаю, но этоне в этом суть (и это, конечно, не та ошибка, с которой я сейчас сталкиваюсь).

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

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

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

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

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

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

0 голосов
/ 11 августа 2011

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

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

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

0 голосов
/ 11 августа 2011

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

from otherfile import *

def method1():
   print "dosomthing"

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

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

...