【问题标题】:Value Changed in Class B calls function in Class A to update object of class AB 类中的值更改调用 A 类中的函数来更新 A 类的对象
【发布时间】:2022-01-17 10:03:50
【问题描述】:

我想在另一个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

在我的代码中,我使用这样的类:

a=A()

然后我将在 (a.somearray) 中有一个列表 somearray,其中包含 B 的对象。所以如果我想更新这个对象B

a.somearray[0].updatesomevalue(10)

那么不仅a.somearray[0].somevalue 应该有一个新值,而且A 类的函数更新事件应该触发更改a。我该怎么做?

【问题讨论】:

  • 请注意somearray 是类属性,可变列表并在A 类的所有实例之间共享,即如果您更改一个实例,它将在所有实例中更新。我不知道这是不是故意的。

标签: python function class events handle


【解决方案1】:

我有两种方法可以在不调用任何特殊魔法的情况下实现这一目标。

首先是让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 的接口相对较小(以避免提供大量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 等在您的示例中都被创建为类属性(即它们将在所有实例之间共享,而不是每个实例都有自己的实例)。这可能不是您想要的。

【讨论】:

  • 非常感谢您的回答。我也觉得方法二更直观!
  • 另外你是对的 somearray 和 somevalue 不打算作为类属性。
猜你喜欢
  • 2015-09-07
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多