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

时间:2015-10-23 18:15:30

标签: python python-2.7 oop object metadata

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

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对第二个对象及其元数据的操作。 为简单起见,我通过obj写 here 。没有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. 我想在subobj s 没有元数据之间传递obj,并让这些obj更改。元数据应该存储在objs内定义的信息,而不是subobj。因此,func()的值取决于obj本身,但其定义对于obj的所有class obj都是相同的。

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

  3. 我将拥有数以千计的这些对象,因此我正在寻找一种不受少量对象约束的抽象解决方案。

  4. 目前的设计有可能吗?关于如何实现这一点,我很遗憾。

1 个答案:

答案 0 :(得分:1)

假设obj s'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上调用的函数。这可以通过跟踪每个objs所使用的subobj列表,然后创建一个特殊的data属性,在每次更改时通知每个obj