Python作用域/命名空间问题
我有两个Python模块:
//// funcs.py
from classes import *
def func():
d = D()
print "func"
if __name__ == "__main__":
c = C()
//// classes.py
from funcs import *
class C:
def __init__(self):
print "C class"
func()
class D:
def __init__(self):
print "D class"
运行funcs.py时出现了一个名称错误,提示“全局名称'D'未定义”。不过如果我把创建D()实例的那行代码注释掉,程序就能正常运行。
这是为什么呢?
谢谢
2 个回答
2
这个问题是因为在模块初始化的时候,试图使用一个循环导入的模块。简单来说,使用“from 模块 import *”时,要求这个模块必须先被编译。如果你改成在两种情况下都使用“import 模块”,那就应该没问题了。
5
这个方法很好用,而且不会让你的代码变得复杂:
///funcs.py
import classes
def func():
d = classes.D()
print "func"
if __name__ == "__main__":
c = classes.C()
///classes.py
import funcs
class C:
def __init__(self):
print "C class"
funcs.func()
class D:
def __init__(self):
print "D class"
有时候,直接使用简单的导入方式比用 from ... import ...
要好得多。关于这个话题,有一篇不错的文章可以参考:http://effbot.org/zone/import-confusion.htm