更改共享子对象时更新对象中的元数据
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()
。我将不胜感激任何提示。
备注:
我想在 obj
秒 之间传递那些 subobj
而无需元数据 并让它们被那些 objs 更改。元数据应该存储 objs
中定义的信息,而不是 subobj
中定义的信息。因此,func()
的值取决于 obj
本身,但它的定义对于 class obj
的所有 obj
都是相同的。
为简单起见,此 func(metadata)
可以类似于 multiply3(metadata)
。
我会有成千上万个这样的对象,所以我正在寻找一个不受少量对象限制的抽象解决方案。
在目前的设计中可以吗?我不知道如何实现这个。
假设 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
。这是通过跟踪每个 subobj
使用的 objs
列表,然后创建一个特殊的 data
属性 来通知每个 obj
每当它发生变化时.
我需要经验丰富的程序员的建议,因为我无法解决这个问题。 我有以下数据结构。
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()
。我将不胜感激任何提示。
备注:
我想在
obj
秒 之间传递那些subobj
而无需元数据 并让它们被那些 objs 更改。元数据应该存储objs
中定义的信息,而不是subobj
中定义的信息。因此,func()
的值取决于obj
本身,但它的定义对于class obj
的所有obj
都是相同的。为简单起见,此
func(metadata)
可以类似于multiply3(metadata)
。我会有成千上万个这样的对象,所以我正在寻找一个不受少量对象限制的抽象解决方案。
在目前的设计中可以吗?我不知道如何实现这个。
假设 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
。这是通过跟踪每个 subobj
使用的 objs
列表,然后创建一个特殊的 data
属性 来通知每个 obj
每当它发生变化时.