在Python中导入模块

Apu*_*lol 1 python import module

如果我有一个模块说A.py,其中

import xxx
import yyy

class P:
    def __init__(self):
        pass
p = P()
Run Code Online (Sandbox Code Playgroud)

每次导入A,在每个模块中,还是只执行一次,最后一行代码是否会被执行?我试图使它成为单例实例,即在整个执行会话中只能使用一个实例.所以请分享,如何做到这一点.谢谢.

bru*_*ers 5

模块顶层的代码仅在每个进程执行一次(第一次为此进程导入模块).在module随后的对象实例存储在sys.modules和随后进口量将会从那里访问.

唯一需要注意的是,当通过2个不同的限定名称导入相同的模块时,在这种情况下,它被视为两个不同的模块(因此顶级对于同一个进程执行两次),但这确实是一个非常罕见的极端情况.

这是一个简单的例子,你可以在动作中看到 - mod.py导入四次但只执行一次(在第一次导入时):

bruno@bigb:~/Work/playground/imptrace$ ls *.py
a.py  b.py  c.py  main.py  mod.py

bruno@bigb:~/Work/playground/imptrace$ cat mod.py
class P(object):
    def __init__(self):
        print "p %s initialzed" % id(self)

p = P()

bruno@bigb:~/Work/playground/imptrace$ cat a.py
print "in a.py"
import mod

bruno@bigb:~/Work/playground/imptrace$ cat b.py
print "in b.py"
import mod

bruno@bigb:~/Work/playground/imptrace$ cat c.py
print "in c.py"
import mod 

bruno@bigb:~/Work/playground/imptrace$ cat main.py
import a
import b
import c
import mod

bruno@bigb:~/Work/playground/imptrace$ python main.py
in a.py
p 139818712152976 initialzed
in b.py
in c.py
Run Code Online (Sandbox Code Playgroud)

编辑:你说明了

我试图让它成为一个单例实例,

这不会使您的类成为单例 - 没有什么能阻止某人创建其他P实例.如果你真的想要一个单例,你必须覆盖P.__new__()以防止创建单个实例(规范单例)或更改P以便它只使用类属性和类方法,以便所有实例实际上将共享相同的属性.