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

Mat*_*ner 7 python namespaces module globals python-3.x

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

此示例仅为示例:

# module_a.py

my_global = []

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

class B:
    def __init__(self):
        my_global.append(self)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,如果我创建一个Avia 的实例A(),它将调用append名为的对象my_global.但是现在我希望创建一个新模块,导入B它,并从已导入的模块中B使用my_global,而不是原始定义my_global的模块B.

# module_b.py

from module_a import B

my_global = []
Run Code Online (Sandbox Code Playgroud)

有关

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

Update0

  • 上面的例子仅用于说明我想要实现的目标.
  • 由于类没有变量范围(不像C++),我认为对全局变量的引用不存储在类中,而是在定义时附加到每个函数.

UPDATE1

标准库要求提供一个示例:

许多(也许所有?)的在类threading模块使用全局变量如_allocate_lock,get_ident_active定义在这里这里.如果不更改该模块中的所有类,则无法更改这些全局变量.

Pet*_*rin 5

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

我相信你很熟悉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()
Run Code Online (Sandbox Code Playgroud)

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

毋庸置疑,该模块并未考虑到这一点,特别是对于系统模块,threading您可能会遇到问题.例如,threading._active应该包含所有正在运行的线程,但是使用这个解决方案,_active它们都不会全部.该代码也可能会吃你的袜子,并将你的房子着火等.严格测试.


gec*_*cco -2

恕我直言,不可能覆盖全局变量......