Python-在不同类的不同实例之间共享变量


问题内容

这个问题已经在这里有了答案

Python:如何在不同类的实例之间共享数据? (1个答案)

2年前关闭。

我一直在寻找下一个答案,但可以肯定的是,我一直在寻找错误的关键词。我以前使用C
++开发,在对象之间传递指针作为引用。情况是,现在我正在尝试在Python中构建程序,其中类“常规”的一个实例使用相同的共享变量初始化类“特定”的不同实例。

class General():
    def __init__(self):
        self._shared_variable = 0
        self._specific1 = Specific(self._shared_variable)
        self._specific2 = Specific(self._shared_variable)

class Specific():
    def __init__(self, shared):
        self._shared = shared
    def modify_shared_variable(self):
        self._shared_variable +=1

因此,我想做的事是'shared_variable'在de
General范围内共享的,因此,当“特定”实例修改其内部变量时,此更改将被另一个实例看到或镜像。但这不是python中的情况。因此,每个特定实例都有其自己的变量。我该如何实现?


问题答案:

您不能在Python中引用变量。变量只是某个名称空间(通常__dict__是模块,类或实例对象的名称,或函数调用框架内的特殊本地名称空间)的名称。

您可以引用 ,但是数字当然是不可变的,因此您不能将数字1更改为数字2。

所以,你所能做的就是创造某种持有数量可变的值,并分享引用的 那个


一种明显的可能性是仅给每个Specific实例一个对General创建它的实例的引用:

class General():
    def __init__(self):
        self._shared_variable = 0
        self._specific1 = Specific(self)
        self._specific2 = Specific(self)

class Specific():
    def __init__(self, shared_general):
        self._shared_general = shared_general
    def modify_shared_variable(self):
        self._shared_general._shared_variable +=1

另一种可能性是存储一个单元素列表:

class General():
    def __init__(self):
        self._shared_variable = [0]
        self._specific1 = Specific(self._shared_variable)
        self._specific2 = Specific(self._shared_variable)

class Specific():
    def __init__(self, shared):
        self._shared = shared
    def modify_shared_variable(self):
        self._shared[0] += 1

(这实际上与您在C ++中所做的一样,但是没有数组和指针的语法糖几乎是同一件事……)


或者,您可以创建一个简单的MutableInteger类,该类包含一个int,代理非变异方法,添加一个set替代它的方法+=以及通过调用set和returnself而不是返回新值来处理其他变异方法。