gpt4 book ai didi

python - 从项目中的两个单独脚本访问库中的类实例

转载 作者:行者123 更新时间:2023-12-04 20:29:53 24 4
gpt4 key购买 nike

我进行了全面搜索,无法提出合理的搜索查询来产生有用的结果。我将尝试用一个简单的例子(经过测试)来解释这一点。

假设我有一些小的自定义 Python 库,其中仅包含以下私有(private)类和它的公共(public)实例:

#!/usr/bin/env python

class _MyClass(object):
def __init__(self):
self.val = "Default"

my_instance = _MyClass()

现在,我还有另外两个 python 文件('file_a' 和 'file_b'),它们最终会从我的库中导入这个实例,如下所示。

'file_a' 中的完整代码:
#!/usr/bin/env python

from my_lib import my_instance

my_instance.val = "File A was here!"
import file_b
file_b.check_val()

'file_b' 中的完整代码:
#!/usr/bin/env python

from my_lib import my_instance

def check_val():
print "From 'file_b', my_instance.val is: {}".format(my_instance.val)

如果我只在还包含“file_b”和“my_lib”的目录中执行“file_a”,结果输出是这样的:

From 'file_b', my_instance.val is: File A was here!

有人可以向我解释在我的示例中“file_b”如何能够访问与“file_a”相同的实例吗?这是否与“file_a”中设置的值是全局的有关吗?

顺便说一句,我确实知道我可以再次公开“MyClass”并在“file_a”或“file_b”中需要唯一实例时实例化它,但我发布这个问题的主要原因是绕开我的脑袋这个具体的概念。

最佳答案

这里有两点你需要了解:
1.模块缓存
Python 缓存模块导入以提高性能,即使您这样做 from foo import bar 也会发生这种情况.模块对象存储在 sys.modules .
因此,在您的情况下,file_afile_b正在访问相同的模块对象 my_lib和同一个实例 my_instance .
2. 引用文献
在 Python 中,变量赋值基本上是为同一个对象添加一个新的引用,对于导入也是如此。

from my_lib import my_instance
基本上是
import my_lib
my_instance = my_lib.my_instance
del my_lib
现在我们在 file_a 中修改这个实例,我们基本修改了 my_lib中的实例, 和 file_b也会看到这种变化。

您可以修改 file_afile_b来验证这一点。 file_a :
#!/usr/bin/env python

from my_lib import my_instance

my_instance.val = "File A was here!"

print "Inside file_a"
import sys
print id(sys.modules['my_lib']), sys.modules['my_lib'].my_instance, my_instance

import file_b
file_b.check_val()
file_b :
#!/usr/bin/env python

from my_lib import my_instance

print "Inside file_b"
import sys
print id(sys.modules['my_lib']), sys.modules['my_lib'].my_instance, my_instance


def check_val():
print "From 'file_b', my_instance.val is: {}".format(my_instance.val)
输出(检查对象 ID):
>>> %run file_a.py

Inside file_a
4396461816 <my_lib._MyClass object at 0x106158ad0> <my_lib._MyClass object at 0x106158ad0>
Inside file_b
4396461816 <my_lib._MyClass object at 0x106158ad0> <my_lib._MyClass object at 0x106158ad0>
From 'file_b', my_instance.val is: File A was here!

关于python - 从项目中的两个单独脚本访问库中的类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48737516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com