我有一个似乎相当基本的问题,但我似乎无法在任何地方找到任何帮助。
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()
XYZ.doSomething()无法说出NameError:未定义名称“XYZ” 甚至像file_a这样的'import sys'这样的标准导入似乎也没有使它在file_b中可用。我认为应该工作。我的理解错了吗?如果是,那么有没有办法在文件中包含常见的导入和全局变量? (如果它有帮助,我一直是C ++和java程序员,我现在开始使用python。)
答案 0 :(得分:5)
我的理解错了吗?
是的,因为行from file_a import A
只将A
类导入file_b
的命名空间。 file_a
的名称空间不变。如果它不是这样的话,那么两种句法都没有意义:
import modulename
from modulename import something
好像你的想法是正确的,然后在第二个表格之后,你总是可以使用modulename.someotherthing
。
如果是,那么有没有办法在文件中包含常见的导入和全局变量?
是的,使用明星*
运营商:
from modulename import *
但是这会带来名称空间污染问题,例如from file_a import *
将在file_b
中导入file_a
中完成的所有导入。你将最终失去对你的进口的控制权,这会在某个时候咬你...相信我!
由于某些原因需要from module import *
,名称空间污染的解决方法是在module
variable __all__
中定义,该列表应将使用星号运算符导入的内容列入白名单。
HTH!
答案 1 :(得分:4)
导入模块时,该模块中定义的所有变量都可在其命名空间中使用。因此,如果XYZ
模块中有file_a
,那么当您import file_a
时,您可以XYZ
访问file_a.XYZ
。
这里的一般想法是你的命名空间不应该被其他命名空间的内容混乱。
答案 2 :(得分:3)
是的,你的理解是错误的。每个模块都是自己的命名空间,只有您在该文件中显式导入的内容才可在该命名空间中使用。
与其他答案相反,引用file_a.XYZ
并不是特别Pythonic,尽管这会起作用。相反,您应该在file_b
的顶部导入XYZ和sys。
答案 3 :(得分:1)
import file_a
from file_a import A
我认为问题是:你真的没有导入XYZ!
from fila_a import *
可以解决你的问题,但这不是一个好方法~~~
你可以在file_b中写这个:
from file_a import XYZ
完成了吗?