gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:33 26 4
gpt4 key购买 nike

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

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.这里 编写。没有 setter/getter 的变量:

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

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

我根本不知道如何让每个 obj 了解共享相同 subobj< 的所有其他 obj/code> 就像它一样。我可以在掌握这些知识后触发func()。我将不胜感激任何提示。

注释:

  1. 我想在 obj 之间传递这些 subobj不带元数据,并让这些 obj 更改它们。元数据应该存储 objs 中定义的信息,而不是 subobj 中定义的信息。因此,func() 的值取决于 obj 本身,但其定义对于 obj 的所有 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 使用的 obj 列表,然后创建一个特殊的 data 属性来通知每个 obj 每当它改变时。

关于python - 更改共享子对象时更新对象中的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33308945/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com