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

我没有解决的是 somearraysomevalue 等都在您的示例中创建为 class 属性(即它们将在所有实例之间共享,而不是每个实例都有自己的实例)。这可能不是您想要的。