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