python:可以修改单个';硕士';对象

python:可以修改单个';硕士';对象,python,class,oop,pointers,attributes,Python,Class,Oop,Pointers,Attributes,假设我有一个包含一组参数的master对象的单个实例,然后是应该能够访问和修改master属性的slave对象的多个实例。在我的特殊情况下,从属对象是wxPythonGUI对象,其中可能有多个GUI控件可以修改相同的参数 显然,如果我在从机想要更新它时显式地引用master.parameter,那么这是微不足道的。然而,我真的不想这样做,因为这需要我编写不同的函数来处理来自每个从属对象的事件 我目前正在做类似的事情,master为每个属性分别提供了get\u value和set\u value方

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

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

我目前正在做类似的事情,
master
为每个属性分别提供了
get\u value
set\u 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\u value
,其行为类似于指向
master.value
的指针,这样当任何
slave
修改其
bound\u值时,
master
的相应属性就会更新。我完全知道Python不支持指针,但我想知道是否有一种很好的Python方法可以实现同样的目标?

您可以通过生成
bound\u value
a来完成您的要求,该值封装了对主控
get\u value
set\u 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\u value

感谢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()

“我完全知道Python不支持指针”——Python中的每个名称都是一个引用。这在很多方面都是非常简单的。如果你为你想要的值创建了一个可变对象,那么从属对象和主对象都可以存储一个对它的引用,它的功能将完全符合你的需要;我们很少需要使用getter和setter。当我们这样做时,我们将这些代码打包在<代码> @属性< /代码>中,以隐藏我们使用的是GETTER和SETTER。@ LATTIWRADE是指指针,它们像C或C++中的指针一样,正如我所讨论的,我仍然有一段很难的时间来确定您想要什么。您想创建一个
Slave
对象,将以
绑定
开始的属性上的操作委托给
?@mgilson否,我想创建一个
Slave
实例,该实例“绑定”到
实例的属性上,因此,当
slave
更新其
bound\u值
属性时,
master
的相应属性也会更改,我以前曾尝试将
master.value
设置为属性属性,这显然不是我想要的,因为当我分配
slave.bound\u value=master.value
时,我实际上只是分配
master.value