我可以让这段代码正常工作,但我仍然很困惑为什么它在我尝试的第一种方法中不起作用。
我正在练习 python,因为我的论文将在其中进行编码(使用 Arduino 和 PC 接口(interface)做一些很酷的事情)。我正在尝试将另一个文件中的类导入到我的主程序中,以便我可以创建对象。这两个文件都在同一个目录中。如果您此时查看代码,可能会更容易。
#from ArduinoBot import *
#from ArduinoBot import ArduinoBot
import ArduinoBot
# Create ArduinoBot object
bot1 = ArduinoBot()
# Call toString inside bot1 object
bot1.toString()
input("Press enter to end.")
这是最基本的 ArduinoBot 类
class ArduinoBot:
def toString(self):
print ("ArduinoBot toString")
前两个注释掉的 import 语句中的任何一个都可以使这项工作正常进行,但最后一个不行,对我来说这似乎是最直观和最通用的。这里没有太多的代码会出错,当我听说过 Python 的一些好东西时,遇到这些挑剔的语言特定的怪癖有点令人沮丧。不管怎样,我一定是做错了什么,但为什么简单的“导入类名”或“导入文件名”不起作用?
感谢您的帮助。
最佳答案
考虑一个文件(example.py
):
class foo(object):
pass
class bar(object):
pass
class example(object):
pass
现在在你的主程序中,如果你这样做:
import example
应该从文件 example.py
导入什么?只是类 example
吗? foo
类也应该出现吗?如果 import module
将整个模块的命名空间直接拉到您当前的命名空间中,其含义就太模糊了。
这个想法是命名空间很棒。他们让您知道类/函数/数据的来源。它们还可以让您将相关的事物组合在一起(或者等效地,它们可以帮助您将不相关的事物分开!)。一个模块设置了一个命名空间,然后您通过使用 import
的方式告诉 python 您希望如何将该命名空间带入当前上下文(命名空间)。
from ... import *
表示 -- 将该模块中的所有内容直接引入我的命名空间。
from ... import ... as ...
说,只将我指定的东西直接带入我的命名空间,但在这里给它一个新名称。
最后,import ...
只是说将该模块引入当前命名空间,但将其分开。由于(至少)两个原因,这是生产代码中最常见的形式。
- 它可以防止名称冲突。你可以有一个名为
foo
的本地类,它不会与example.py
中的foo
冲突——你可以通过example.foo
- 它可以很容易地跟踪一个类来自哪个模块以进行调试。
考虑:
from foo import *
from bar import *
a = AClass() #did this come from foo? bar? ... Hmmm...
在这种情况下,要从 example.py
访问类 example
,您还可以:
import example
example_instance = example.example()
但你也可以获得foo
:
foo_instance = example.foo()
关于python - 从 python 中的另一个文件导入类 - 我知道修复方法,但为什么原始文件不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14179290/