1

我有一些编程经验,但我对 python 很陌生,我正在尝试弄清楚如何使用和导入除主文件以外的 .py 文件中的类。我目前正在使用 netbeans,运行 CPython 3.2.1。

通过我现在的设置,我所有的 .py 文件都在同一个文件夹中。忽略内容实际上是什么,它看起来像这样:

python程序.py

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

def method1():
   dostuff

其他文件.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 的使用是否正确,现在我想到了,但这不是重点(当然也不是我现在正在处理的错误)。

我很难找到与我遇到的错误直接相关的教程或其他问题,但这可能只是因为我对 python 非常不熟悉,以至于我在看到它时忽略了它;因此,如果有人想指出我正确的教程,那也很好。

否则,我只想知道我在如何设置所有内容方面做错了什么,以及我应该如何纠正它。

如果有帮助,我先学习了 Java,并且还可以使用 C# 和 C++。

4

3 回答 3

2

您的问题是由循环导入引起的。由于定义事物的顺序方式,Python 在这方面不如其他一些语言灵活。在您的情况下,可以定义之前的pythonprogram要求classB。但是可以定义之前的要求!otherfilemethod1otherfilemethod1classB

您有时可以通过将import行进一步向下移动到模块来解决循环导入。但是解决这个问题的最好方法是完全避免模块之间的双向依赖。它通常会产生更清洁和设计更好的程序。

于 2011-08-10T21:59:52.910 回答
0

如果你想将 pythonprogram.py 用作一个模块,你可以改变它如下:

from otherfile import *

def method1():
   print "dosomthing"

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

当你运行 pythonprogram.py 时,条件name == " main " 为真,当你从其他模块导入 pythonprogram 时,name == " main " 为假。

于 2011-08-10T22:15:52.493 回答
0

在最基本的层面上,您试图在定义它之前调用method1()它。

本质上,您正在调用classB,而后者又调用classA,它试图调用method1,但是您正在做的第一件事是在定义classB()之前的一行上。method

摆脱这种混乱的最简单方法是将除实际执行操作的代码部分之外的所有内容移动到文件的最后。

于 2011-08-10T22:24:09.960 回答