Python中的模块导入
如果我有一个模块说 A.py,其中Python中的模块导入,python,import,module,Python,Import,Module,如果我有一个模块说 A.py,其中 import xxx import yyy class P: def __init__(self): pass p = P() 最后一行代码是在每次导入时执行,还是在每个模块中执行,还是只执行一次? 我正试图使它成为一个单例实例,即在整个执行会话中只能使用一个实例。因此,请分享,如何做到这一点。 谢谢。是的,你的确是对的。 每次导入此类时,将创建P类型的对象。 类/函数定义之外的所有内容实际上都被视为可执行命令是的-您确实是正确的。
import xxx
import yyy
class P:
def __init__(self):
pass
p = P()
最后一行代码是在每次导入时执行,还是在每个模块中执行,还是只执行一次?
我正试图使它成为一个单例实例,即在整个执行会话中只能使用一个实例。因此,请分享,如何做到这一点。
谢谢。是的,你的确是对的。 每次导入此类时,将创建
P
类型的对象。
类/函数定义之外的所有内容实际上都被视为可执行命令是的-您确实是正确的。 每次导入此类时,将创建
P
类型的对象。
类/函数定义之外的所有内容实际上都被视为可执行命令每个进程只执行一次模块顶层的代码(第一次为此进程导入模块)。然后,
module
对象实例存储在sys中。modules
随后的导入将从那里访问它
唯一需要注意的是,当同一个模块通过两个不同的限定名导入时,在这种情况下,它被视为两个不同的模块(因此对同一进程执行两次顶层),但这确实是一种非常罕见的情况
下面是一个简单的示例,您可以看到在操作中-mod.py
被导入四次,但只执行一次(在第一次导入时):
编辑:你说
我正在尝试将其作为一个单例实例
这不会使您的类成为单例-没有任何东西阻止某人创建其他
p
实例。如果你真的想要一个单例,你必须重写P.\uuuu new\uuuu()
,以防止创建多个实例(规范单例),或者更改P
,使其只使用类属性和类方法,因此,所有实例实际上将共享相同的属性。每个进程只执行一次模块顶层的代码(第一次为此进程导入模块)。然后,module
对象实例存储在sys中。modules
随后的导入将从那里访问它
唯一需要注意的是,当同一个模块通过两个不同的限定名导入时,在这种情况下,它被视为两个不同的模块(因此对同一进程执行两次顶层),但这确实是一种非常罕见的情况
下面是一个简单的示例,您可以看到在操作中-mod.py
被导入四次,但只执行一次(在第一次导入时):
编辑:你说
我正在尝试将其作为一个单例实例
这不会使您的类成为单例-没有任何东西阻止某人创建其他
p
实例。如果你真的想要一个单例,你必须重写P.\uuuu new\uuuu()
,以防止创建多个实例(规范单例),或者更改P
,使其只使用类属性和类方法,以便每次导入一个实例时,所有实例都将实际共享相同的属性。(第一次)在每个模块中。只需添加一个print
来说服自己:)在相同的过程中第一次。每次在每个模块中导入一个(第一次)。只需在同一过程中第一次添加一个print
就可以说服自己:)错误。对于给定的进程,模块的顶层只执行一次(在第一次导入时)。抱歉,我没有考虑多个导入。错误。对于给定的进程,模块的顶层只执行一次(在第一次导入时)。抱歉,我没有考虑多次导入。太棒了,谢谢@brunodesthuilliers@ApurvaKunkulol很高兴我能帮上忙——然后接受答案;)当然会的。太棒了,谢谢@brunodesthuilliers@ApurvaKunkulol很高兴我能帮上忙——然后接受答案;)当然我会的。
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