我一直在寻找下一个答案,但可以肯定的是我在搜索错误的关键字。 我以前使用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
因此,我想做的事是在de General范围内共享此'shared_variable'
,因此,当“特定”实例修改其内部变量时,此更改将被另一个实例看到或镜像。但这不是python中的情况。因此,每个特定实例都有其自己的变量。我该如何实现?
答案 0 :(得分:1)
您无法在Python中引用变量。变量只是某个名称空间(通常是模块,类或实例对象的__dict__
或函数调用框架内的特殊本地名称空间)的名称,值。
您可以引用值,但是数字当然是不可变的值,因此您不能将数字1更改为数字2。
因此,您可以做的是创建一个保存该数字的可变值,并共享对该 that 的引用。
一种明显的可能性是仅给每个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
方法来替换它,并处理{{1} }和其他变异方法,方法是调用+=
并返回set
,而不是返回新值。