Python名称错误问题
我有一些编程经验,但我对python非常陌生,我正在尝试了解如何使用和导入.py文件中的类,而不是main文件。我目前正在使用netbeans,运行cpython3.2.1 现在使用我的设置,我的所有.py文件都在同一个文件夹中。忽略内容的实际内容,它看起来是这样的: pythonprogram.pyPython名称错误问题,python,cpython,nameerror,Python,Cpython,Nameerror,我有一些编程经验,但我对python非常陌生,我正在尝试了解如何使用和导入.py文件中的类,而不是main文件。我目前正在使用netbeans,运行cpython3.2.1 现在使用我的设置,我的所有.py文件都在同一个文件夹中。忽略内容的实际内容,它看起来是这样的: pythonprogram.py from otherfile import * obj = classB() print(obj.run()) def method1(): dostuff otherfile.py i
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()
回溯(最近一次调用):
中第4行的C:\users\me\projects\pythonprogram.py
从房间导入*
中第4行的C:\users\me\projects\otherfile.py
导入python程序
中第13行的C:\users\me\projects\pythonprogram.py
obj=classB()
由于不熟悉python,有人可能想让我知道我对super的使用是否正确,现在我开始考虑它,但这不是重点(当然也不是我现在正在处理的错误)
我很难找到与我所犯错误直接相关的教程或其他问题,但这可能只是因为我对python如此不熟悉,以至于在看到python时忽略了它;所以,如果有人想给我指出正确的教程,那也没关系
否则,我只想知道我在如何设置一切方面做错了什么,以及我应该如何纠正它
<>如果有帮助,我首先学习java,也可以使用C++和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时,条件name=“main”将为真,当您从其他模块导入pythonprogram时,name=“main”将为假。在它的最基本级别上,您试图在定义它之前调用
method1()
本质上,您正在调用classB
,后者反过来调用classA
,后者试图调用method1
,但您首先要做的是,在定义方法之前的一行上,classB()
摆脱这一混乱局面的最简单方法是将所有内容(除了代码中实际处理内容的部分)移到文件的末尾。我想我能理解为什么这会是一个问题。我将尝试将这些依赖性排除在我的程序之外。非常感谢。这确实解决了我的问题。谢谢