【问题标题】:python: multiple objects that can modify the attributes of a single 'master' objectpython:可以修改单个“主”对象属性的多个对象
【发布时间】:2013-02-14 16:06:43
【问题描述】:

假设我有一个包含一组参数的master 对象的单个实例,然后是应该能够访问和修改主控属性的slave 对象的多个实例。在我的特殊情况下,slave 是wxPython GUI 对象,其中可能有多个 GUI 控件可以修改相同的参数。

如果我在从站想要更新它时明确引用master.parameter,显然这是微不足道的。但是我真的不想这样做,因为它需要我编写不同的函数来处理来自每个从属对象的事件。

我目前正在做这样的事情,master 对每个属性都有单独的 get_valueset_value 方法:

class Master(object):
    def __init__(self):
        self.value = 0

    def get_value(self):
        return self.value

    def set_value(self,value):
        self.value = value

class Slave(object):
    def __init__(self,getfunc,setfunc):
        self.getfunc = getfunc
        self.setfunc = setfunc

    def update(self,value):
        self.setfunc(value)

def run():
    master = Master()
    slave = Slave(master.get_value,master.set_value)

    print "\nMaster: %i\nSlave: %i" %(master.value,slave.getfunc())

    slave.update(1)
    print "\nMaster: %i\nSlave: %i" %(master.value,slave.getfunc())

if __name__ == "__main__":
    run()

我真正想做的是设置slave.bound_value之类的东西,它的行为就像指向master.value的指针,这样当任何slave修改其bound_value时,@987654334的相应属性@ 已更新。我完全知道 Python 不支持指针,但我想知道是否有一种很好的 Pythonic 方法来实现相同的目标?

【问题讨论】:

  • “我完全知道 Python 不支持指针” - Python 中的每个名称都是一个引用。这在很多方面都很简单。如果你为你想要的值创建一个可变对象,那么从服务器可以像主服务器一样存储对它的引用,它会完全按照你的意愿运行。
  • 注意Python不是Java;我们很少需要使用 getter 和 setter。当我们这样做时,我们将它们包装在 @property 中以隐藏我们正在使用 getter 和 setter 的事实。
  • @Lattyware 我的意思是像 C 或 C++ 中的指针一样工作的指针,正如 here所讨论的那样@
  • 我仍然很难弄清楚你想要什么。您想创建一个Slave 对象,将对以bound_ 开头的属性的操作委托给Master
  • @mgilson 不,我想创建一个Slave 的实例,它“绑定”到Master 实例的属性,这样当slave 更新它的bound_value 属性时,那么master对应的属性也会发生变化

标签: python class oop pointers attributes


【解决方案1】:

您可以通过将 bound_value 封装到主控的 get_valueset_value 方法的调用来完成您的要求。这将使bound_value 看起来只是Slave 类的成员变量。

class Slave(object):
    def __init__(self,getfunc,setfunc):
        self.getfunc = getfunc
        self.setfunc = setfunc
    @property
    def bound_value(self):
        return self.getfunc()

    @bound_value.setter
    def bound_value(self, value):
        self.setfunc(value)

然后,您可以简单地引用slave.bound_value,就像它是一个成员变量一样,只要您想获取或设置值。

【讨论】:

  • 啊,我之前尝试过将master.value 设为属性属性,这显然没有达到我想要的效果,因为当我分配slave.bound_value = master.value 时,我实际上只是分配了master.value 的当前值
【解决方案2】:

感谢 bogatron 让我走上了正确的道路——这就是我最终选择的:

class Master(object):
    value = 0

class Slave(object):
    def __init__(self,master,attrname):
        self._master = master
        self._attrname = attrname
    @property
    def value(self):
        return self._master.__getattribute__(self._attrname)
    @value.setter
    def value(self,newvalue):
        self._master.__setattr__(self._attrname,newvalue)

def run():
    master = Master()
    slave = Slave(master,'value')

    print master.value,slave.value
    slave.value = 2
    print master.value,slave.value

if __name__ == "__main__":
    run()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2013-05-17
    • 2020-11-10
    • 2017-09-18
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多