【问题标题】:Python: How can I initialise object in one module and use it in anotherPython:如何在一个模块中初始化对象并在另一个模块中使用它
【发布时间】:2019-04-03 14:00:49
【问题描述】:

我的设置: mod1.py:

class cars:
    def __init__(self,x,y,z):
        self.x = x

mod2.py:

import mod1
obj = mod1.cars(x,y,z)

mod3.py

from mod2 import obj

现在,发生的事情是当我在汽车的 mod3.py 初始化方法中导入 obj 时正在执行。我想要它,因为 obj 已经在 mod2.py 中初始化,mod3 应该已经初始化实例而不是创建新实例。 我怎么能在python中做到这一点

【问题讨论】:

  • 你认为为什么要创建一个新的?
  • 你为什么不用from mod2 import obj
  • 哦,我错过了,@Bazingaa。这可能解释了它。
  • 它不应该在每个导入时执行。仅在 first 导入时。您确定在运行mod3.py 时没有看到第一个导入吗?然后它将导入mod2,实例化一个实例,打印一条消息。但我相信,随后导入 obj from mod2 不会导致额外的打印。请在您看到多个实例的地方发布minimal reproducible example
  • 我试过你的代码,从两个单独的模块中导入它,只看到__init__ 的一个打印。无法复制。

标签: python oop python-import pickle python-object


【解决方案1】:

现在,当我在 mod3.py 中导入 obj 时,汽车的 init 方法正在执行。

当然可以,这就是你告诉 python 要做的事情。第一次导入模块时(在给定进程中),顶层的所有语句都会被执行。你在mod2的顶层创建obj,所以第一次导入mod2时,会导入mod1,然后调用mod1.cars(...),它调用mod1.cars.__init__()

我想要的 obj 已经在 mod2.py 中初始化了,mod3 应该已经初始化了实例

这正是发生的事情。当然对于当前进程 - 对象不存在于进程之外(并且不在进程之间共享)

每次导入是指来自不同模块的每次首次导入

只要所有这些导入发生在同一个进程中,mod2.obj 将只为该进程创建一次。当然,如果你有不同的进程,每个进程都会有它自己的obj 实例——正如我所说,对象只存在于运行时并且不会在进程之间共享(希望如此)。

唯一您可以将同一模块导入两次的情况是,如果您的 sys.path 搞砸了,并且允许针对两个不同的限定名称解析相同的模块名称并且您有一个导入使用一个限定名,另一个使用另一个限定名 - 但这是一种相当罕见的情况。

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    相关资源
    最近更新 更多