更改共享子对象时更新对象中的元数据

update metadata in objects when changing shared subobjects

我需要经验丰富的程序员的建议,因为我无法解决这个问题。 我有以下数据结构。

class obj(object):
    def __init__(self, data=[], meta=[]):
        self.data=data
        self.meta=meta

class subobj(object):
    def __init__(self, data=[]):
        self.data=data

比如说,我正在从中创建以下对象。

sub1=subobj([0,1,5])
sub2=subobj([0,1,6])
sub3=subobj([0,1,7])
objA=obj(data=[sub1,sub2], meta=[3,3])
objB=obj(data=[sub3,sub1], meta=[3,3])

现在我正在更改 sub1 对第二个对象及其元数据的操作。 为简单起见[​​=65=],我在此处 通过 obj 进行编写。没有 setter/getters 的变量:

objB.data[1].data+=[10,11]
objB.meta[1]=5

现在,objA.data[0] 已经(显然)发生了变化。但是 objA.meta[0] 保持不变。我希望某些 func(objB.meta[1])objA.data 中的值发生变化(由 objB.data 引起)后立即触发,并同时更改 objA.meta。重要提示:此 func() 使用来自 objB 的已更改 sub1 的元数据。

我根本不知道如何让每个 obj 知道 所有其他 obj 共享相同 subobj确实如此。我可以在 知道 壁架时触发 func()。我将不胜感激任何提示。

备注:

  1. 我想在 obj 之间传递那些 subobj 而无需元数据 并让它们被那些 objs 更改。元数据应该存储 objs 中定义的信息,而不是 subobj 中定义的信息。因此,func() 的值取决于 obj 本身,但它的定义对于 class obj 的所有 obj 都是相同的。

  2. 为简单起见,此 func(metadata) 可以类似于 multiply3(metadata)

  3. 我会有成千上万个这样的对象,所以我正在寻找一个不受少量对象限制的抽象解决方案。

在目前的设计中可以吗?我不知道如何实现这个。

假设 objs' data 属性 只能包含 subobjs 并且永远不会更改,此代码应该有效。

class obj(object):
    __slots__=("data","meta")
    def __init__(self,data=(),meta=None):
        meta = meta or []
        self.data = data
        self.meta = meta
        for so in data:
            so._objs_using.append(self)
class subobj(object):
    __slots__ = ("_data","_objs_using")
    def __init__(self,data=()):
        self._objs_using=[]
        self._data = data
    @property
    def data(self):
        return self._data
    @data.setter
    def data(self,val):
        self._data = val
        for obj in self._objs_using:
            metadata_changed(obj.meta)

我在元数据上调用了您想调用的函数 metadata_changed。这是通过跟踪每个 subobj 使用的 objs 列表,然后创建一个特殊的 data 属性 来通知每个 obj 每当它发生变化时.