我有一个很基本的问题,但我似乎找不到任何帮助。
file_a.py >>
from xyz import XYZ
class A:
.
.
.
file_b.py >>
import file_a
from file_a import A
class B(A):
def __init__(self):
A.__init__(self)
def someMethod(self):
XYZ.doSomething()
doSomething()未能说出名称错误:未定义名称“XYZ” 即使是从文件a完成的标准导入(如“import sys”)似乎也无法使其在文件b中可用。我认为这应该可以工作。我的理解错了吗?如果是,那么有没有一种方法可以跨文件使用公共导入和全局变量?(如果它不需要帮助,我就成为C++和java程序员,现在开始使用Python。)
是的,你的理解错了。每个模块都是其自己的命名空间,只有在该文件中显式导入的内容才能在该命名空间中使用。
与其他答案相反,虽然这会起作用,但提到
file_a.XYZ
并不是特别的Python。相反,您应该导入位于file_b
顶部的XYZ和sys。导入模块时,该模块中定义的所有变量都在其命名空间中可用。因此,如果
XYZ
在file_a
模块中可用,则当您import file_a
时,可以将XYZ
作为file_a.XYZ
访问。这里的一般思想是,您的名称空间不应该与其他名称空间的内容混淆。
是的,因为行
from file_a import A
只将类A
导入到file_b
的命名空间中。file_a
的名称空间是单独的。如果不是这样的话,两种语法都没有什么意义:如果你的想法是正确的,那么在第二个表单之后,你总是可以使用
modulename.someotherthing
。是的,使用星号
*
运算符:但是这带来了名称空间污染的问题,例如
from file_a import *
将在file_b
中导入,也会在file_a
中导入所有的导入。你最终会失去对进口的控制,这会在某个时候咬你一口。。。相信我!当出于某种原因需要} ,其中列出了应该使用star运算符导入的内容。
from module import *
时,命名空间污染的解决方法是在module
中定义variable ^{啊!
相关问题 更多 >
编程相关推荐