Class 中的值更改 B 调用 Class A 中的函数来更新 class A 的对象
Value Changed in Class B calls function in Class A to update object of class A
我想从另一个 class B
中的 class A
调用一个函数。但是,应该为 A
的对象调用它。我的意思是如果我有这样的东西:
class A:
def __init__(self, ....):
self.valuechanged=False
# do something
objectfromb=B()
self.somearray.append(objectfromb)
def updateevent(self):
self.valuechanged=True
# do some things if update event triggered
class B:
def __init__(self,...):
self.somevalue=0
self.someothervalue=1
# do something
def updatesomevalue(self,somenewvalue):
self.somevalue=somenewvalue
# !!! HERE SHOULD BE A CALL TO CLASS A FUNCTION updateevent
在我的代码中,我使用这样的 classes:
a=A()
然后我将在 (a.somearray
) 中有一个列表 somearray,其中包含一个 B
的对象。因此,如果我想更新此对象 B
为:
a.somearray[0].updatesomevalue(10)
那么不仅a.somearray[0].somevalue
应该有一个新值而且classA
的函数更新事件应该触发改变a
。我该怎么做?
我有两种方法可以在不调用任何特殊魔法的情况下实现这一目标。
首先是让B
类型的对象知道它们属于什么对象A
,这样它们就可以调用updateevent
。这不是我通常喜欢的方式,因为在 A
等实例之间移动 B
实例时需要做额外的管理工作。如果这不是问题,那么它可能是最好的方法。您可以这样做(使用 A
上的方法来创建 B
并为方便起见设置正确的父级):
class A:
valuechanged=False
somearray=[]
def add_b(self):
b = B(self)
somearray.append(b)
return b
def updateevent(self):
self.valuechanged=True
class B:
somevalue=0
someothervalue=1
def __init__(self, parent):
self.parent = parent
def updatesomevalue(self,somenewvalue):
self.somevalue=somenewvalue
self.parent.updateevent()
第二个是在 A 上提供一个方法来完成这两个任务。这仅适用于 1) 您知道 A
将始终包含 B
和 仅 B
和 2) B
的实例s 接口相对较小(避免在 A
上提供大量此类方法)。您可以将其实现为:
class A:
valuechanged=False
somearray=[]
def updatesomevalue(self, index, new_value):
somearray[index].updatesomevalue(new_value)
self.updateevent()
def updateevent(self):
self.valuechanged=True
class B:
somevalue=0
someothervalue=1
def updatesomevalue(self,somenewvalue):
self.somevalue=somenewvalue
我没有解决的是 somearray
、somevalue
等都在您的示例中创建为 class 属性(即它们将在所有实例之间共享,而不是每个实例都有自己的实例)。这可能不是您想要的。
我想从另一个 class B
中的 class A
调用一个函数。但是,应该为 A
的对象调用它。我的意思是如果我有这样的东西:
class A:
def __init__(self, ....):
self.valuechanged=False
# do something
objectfromb=B()
self.somearray.append(objectfromb)
def updateevent(self):
self.valuechanged=True
# do some things if update event triggered
class B:
def __init__(self,...):
self.somevalue=0
self.someothervalue=1
# do something
def updatesomevalue(self,somenewvalue):
self.somevalue=somenewvalue
# !!! HERE SHOULD BE A CALL TO CLASS A FUNCTION updateevent
在我的代码中,我使用这样的 classes:
a=A()
然后我将在 (a.somearray
) 中有一个列表 somearray,其中包含一个 B
的对象。因此,如果我想更新此对象 B
为:
a.somearray[0].updatesomevalue(10)
那么不仅a.somearray[0].somevalue
应该有一个新值而且classA
的函数更新事件应该触发改变a
。我该怎么做?
我有两种方法可以在不调用任何特殊魔法的情况下实现这一目标。
首先是让B
类型的对象知道它们属于什么对象A
,这样它们就可以调用updateevent
。这不是我通常喜欢的方式,因为在 A
等实例之间移动 B
实例时需要做额外的管理工作。如果这不是问题,那么它可能是最好的方法。您可以这样做(使用 A
上的方法来创建 B
并为方便起见设置正确的父级):
class A:
valuechanged=False
somearray=[]
def add_b(self):
b = B(self)
somearray.append(b)
return b
def updateevent(self):
self.valuechanged=True
class B:
somevalue=0
someothervalue=1
def __init__(self, parent):
self.parent = parent
def updatesomevalue(self,somenewvalue):
self.somevalue=somenewvalue
self.parent.updateevent()
第二个是在 A 上提供一个方法来完成这两个任务。这仅适用于 1) 您知道 A
将始终包含 B
和 仅 B
和 2) B
的实例s 接口相对较小(避免在 A
上提供大量此类方法)。您可以将其实现为:
class A:
valuechanged=False
somearray=[]
def updatesomevalue(self, index, new_value):
somearray[index].updatesomevalue(new_value)
self.updateevent()
def updateevent(self):
self.valuechanged=True
class B:
somevalue=0
someothervalue=1
def updatesomevalue(self,somenewvalue):
self.somevalue=somenewvalue
我没有解决的是 somearray
、somevalue
等都在您的示例中创建为 class 属性(即它们将在所有实例之间共享,而不是每个实例都有自己的实例)。这可能不是您想要的。