Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的模块导入_Python_Import_Module - Fatal编程技术网

Python中的模块导入

Python中的模块导入,python,import,module,Python,Import,Module,如果我有一个模块说 A.py,其中 import xxx import yyy class P: def __init__(self): pass p = P() 最后一行代码是在每次导入时执行,还是在每个模块中执行,还是只执行一次? 我正试图使它成为一个单例实例,即在整个执行会话中只能使用一个实例。因此,请分享,如何做到这一点。 谢谢。是的,你的确是对的。 每次导入此类时,将创建P类型的对象。 类/函数定义之外的所有内容实际上都被视为可执行命令是的-您确实是正确的。

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

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