1

master假设我有一个包含一组参数的对象的单个实例,然后slave是应该能够访问和修改主属性的多个对象实例。在我的特定情况下,从属是wxPythonGUI 对象,其中可能有多个 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,相应的属性master就会更新。我完全知道 Python 不支持指针,但我想知道是否有一种很好的 Pythonic 方法来实现相同的目标?

4

2 回答 2

2

bound_value您可以通过制作一个包装对主人和方法的调用的属性来完成您的要求。这将使它看起来只是类的成员变量。get_valueset_valuebound_valueSlave

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然后,您可以在想要获取或设置值时简单地引用它,就像它是一个成员变量一样。

于 2013-02-14T16:20:29.957 回答
1

感谢 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()
于 2013-02-14T18:03:07.603 回答