【问题标题】:Python - Sharing variables between different instances of different classes [duplicate]Python - 在不同类的不同实例之间共享变量[重复]
【发布时间】:2019-01-30 05:33:53
【问题描述】:

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

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中情况并非如此。因此,每个特定实例都有自己的变量。我怎样才能做到这一点?

【问题讨论】:

    标签: python pass-by-reference


    【解决方案1】:

    您不能在 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 方法来替换它,并通过调用@ 来处理+= 和其他变异方法987654330@ 并返回 self,而不是返回新值。

    【讨论】:

    • 嗨! @abarnert 感谢您的快速回答。我采用了第三种方法,而且效果很好!您认为最佳做法是什么?谢谢!
    • @Cristo 这真的取决于你在做什么。就个人而言,我很少使用像“int holder”这样特定的东西,它甚至更具体,比如“用户对象”(碰巧没有字段,只有一个 int 用户 ID),但这并没有'这并不意味着你没有很好的用途。只要您考虑“如何在 Python 中对这些数据建模”而不是“如何将这个 C++ 模型转换为 Python 模型”这样的术语,您的直觉可能会很好。
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多