我需要经验丰富的程序员提供建议,因为我无法解决这个问题。 我有以下数据结构。
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()
。我很感激任何提示。
注意:
我想在subobj
s 没有元数据之间传递obj
,并让这些obj更改。元数据应该存储在objs
内定义的信息,而不是subobj
。因此,func()
的值取决于obj
本身,但其定义对于obj
的所有class obj
都是相同的。
为简单起见,此func(metadata)
可以是multiply3(metadata)
。
我将拥有数以千计的这些对象,因此我正在寻找一种不受少量对象约束的抽象解决方案。
目前的设计有可能吗?关于如何实现这一点,我很遗憾。
答案 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
。