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,在每个模块中,还是只执行一次,最后一行代码是否会被执行?我试图使它成为单例实例,即在整个执行会话中只能使用一个实例.所以请分享,如何做到这一点.谢谢.
模块顶层的代码仅在每个进程执行一次(第一次为此进程导入模块).在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以便它只使用类属性和类方法,以便所有实例实际上将共享相同的属性.
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |