gpt4 book ai didi

python - 在不同模块的上下文中使用类

转载 作者:太空狗 更新时间:2023-10-29 21:58:59 25 4
gpt4 key购买 nike

我想修改标准库中的一些类,以使用该模块中其他类使用的一组不同的全局变量。

例子

这个例子只是一个例子:

# module_a.py

my_global = []

class A:
def __init__(self):
my_global.append(self)

class B:
def __init__(self):
my_global.append(self)

在这个例子中,如果我通过 A() 创建一个 A 的实例,它会调用 append 我的全局。但现在我想创建一个新模块,将 B 导入其中,并让 B 使用导入它的模块中的 my_global,而不是模块 B 中的 my_global 是原始定义的。

# module_b.py

from module_a import B

my_global = []

相关

我正在努力解释我的问题,这是我之前的尝试,它实际上提出了一些完全不同的问题:

更新0

  • 上面的例子只是为了说明我正在努力实现的目标。
  • 由于类没有变量作用域(与 C++ 不同),我认为对全局映射的引用不会存储在类中,而是在定义时附加到每个函数。

更新1

从标准库中请求了一个示例:

threading 中的许多(也许是全部?)类模块使用全局变量,例如 _allocate_lockget_ident_active,定义为 herehere .如果不为该模块中的所有类更改这些全局变量,就无法更改这些全局变量。

最佳答案

您无法在不影响模块的所有其他用户的情况下更改全局变量,但是您可以做的是创建整个模块的私有(private)副本。

我相信你很熟悉sys.modules ,并且如果你从那里删除一个模块,Python 会忘记它是被导入的,但是引用它的旧对象将继续这样做。再次导入时,将生成模块的新副本。

你的问题的 hacky 解决方案可能是这样的:

import sys
import threading

# Remove the original module, but keep it around
main_threading = sys.modules.pop('threading')

# Get a private copy of the module
import threading as private_threading

# Cover up evidence by restoring the original
sys.modules['threading'] = main_threading

# Modify the private copy
private_threading._allocate_lock = my_allocate_lock()

现在,private_threading.Lock 的全局变量完全独立于 threading.Lock!

不用说,编写该模块时并没有考虑到这一点,尤其是对于诸如 threading 之类的系统模块,您可能会遇到问题。例如,threading._active 应该包含所有正在运行的线程,但使用此解决方案,_active 都不会包含所有线程。该代码还可能会吃掉你的 socks 并放火烧掉你的房子等。请严格测试。

关于python - 在不同模块的上下文中使用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7495886/

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