Python在同一个线程上定义了我的类两次

时间:2013-06-21 20:30:11

标签: python class-variables symbol-table

如果我做了一些

,我认为在Python中
class A:
    print("hi")
如果我用一些del A

明确删除了A,那么这个“hi”只能被打印多次

在我稍微大一点的项目中,我有这个代码(名称已更改):

class A(ISomething):
    print(threading.current_thread())
    try:
        A.MY_DICT  # yeah, this should never ever result in anything but an error but neither should this code be run twice
        print(A.MY_DICT)
    except NameError:
        print("A.MY_DICT unknown")
    MY_DICT = {}

并产生此输出:

$ python main.py 
<_MainThread(MainThread, started 140438561298240)>
A.MY_DICT unknown
<_MainThread(MainThread, started 140438561298240)>
A.MY_DICT unknown

所以在同一个线程上,相同的类级代码被执行两次。当我从未del A时,这怎么可能?该代码之前已经有效,但我没有承诺缩小破坏它的变化。

与MY_DICT而不是A.MY_DICT相同的代码同样失败,因为PyDev在撰写本文时已经告诉我这不起作用,我相信有一些可疑的东西。

1 个答案:

答案 0 :(得分:1)

您可能正在以不同的名称导入文件,将其作为__main__文件运行并导入。

当Python运行你的脚本(在命令行上命名的文件)时,它会给它命名为__main__,这是一个存储在sys.modules下的命名空间。但是,如果您使用import语句导入同一个文件,它将再次运行 ,并且生成的命名空间将存储在模块名称下。

因此,python main.py其中main.py包含import main语句或导入其他代码然后再次导入main将导致main.py中的所有代码要运行两次。

另一种选择是您在不同的全名下导入模块两次;作为包的一部分和作为独立模块。当sys.path模块搜索路径中列出包含包和包本身的目录时,就会发生这种情况。