Python作用域/命名空间问题

4 投票
2 回答
525 浏览
提问于 2025-04-17 00:31

我有两个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

撰写回答