gpt4 book ai didi

python - 检查包含的对象是否已更改

转载 作者:行者123 更新时间:2023-11-30 22:00:03 25 4
gpt4 key购买 nike

我正在创建一个带有类的模块,该类充当另一个已创建类的列表的容器。有没有办法让容器类能够判断它包含的任何对象是否已更改?

这是一个例子:

class Part:
def __init__(self, size):
self.part_size = size

class Assembly:
def __init__(self, *parts):
self.parts = list(parts) # `parts` are all Part() objects
self.update()

def update(self):
self.assy_size = 0
for each in self.parts:
self.assy_size += each.part_size

def __getitem__(self, key):
return self.parts[key]

如果我尝试更改 Assembly 中的任何 Part 属性,就会得到以下结果:

>>>x = Part(1)
>>>y = Part(1)
>>>z = Part(1)
>>>u = Assembly(x, y, z)
>>>u.assy_size
3
>>>u[0].part_size = 4
>>>u.assy_size
3

我知道,如果我替换、删除 Part 对象或将 Part 对象添加到 Assembly 中,我可以创建其他方法来调用 update 方法>,但是如果任何包含的 Part 属性发生更改,有什么方法可以通知 Assembly 吗?

最佳答案

答案就在你的问题中。使用属性

class Part:
_size = 0
assembly = None

@property
def part_size(self):
return self._size

@part_size.setter
def part_size(self, value):
self._size = value
if self.assembly: # only notify if an Assembly is set
self.assembly.update()

def set_assembly(self, assembly):
self.assembly = assembly

def __init__(self, size):
self.part_size = size

class Assembly:
def __init__(self, *parts):
self.parts = list(parts) # `parts` are all Part() objects
for part in self.parts:
part.set_assembly(self) # reference to self needed to notify changes
self.update()

def update(self):
self.assy_size = 0
for each in self.parts:
self.assy_size += each.part_size

在此版本的 Assembly 中,构造函数将 Part 上的引用设置为自身。这样,它可以在 part_size 更改时更新程序集。使用它作为您问题中的示例。

>>>x = Part(1)
>>>y = Part(1)
>>>z = Part(1)
>>>u = Assembly(x, y, z)
>>>u.assy_size
3
>>>u[0].part_size = 4
>>>u.assy_size
6

关于python - 检查包含的对象是否已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54426628/

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