我有一个数据管理器类,其中包含数据实例的原始列表。我也有一个GUI类,其中包含每个这些实例的GUI元素。事件发生时,我需要将GUI列表与原始列表同步。
我觉得有一个比遍历两个列表到append()和remove()特定实例更好,更优雅的解决方案。
编辑:一个例子就是
class Foo:
def __init__(self, name='default'):
self.name = name
def __repr__(self):
return self.name
a = Foo(name='a')
b = Foo(name='b')
c = Foo(name='c')
d = Foo(name='d')
l_original = [a, b]
l_synced = [a, b, c]
在这种情况下,我需要一种算法来确保l_synced与l_original 相同,而无需设置l_synced = l_original。
答案 0 :(得分:0)
我会在GUI模型中保留对数据实例的引用。然后,当事件发生时,我将遍历所有GUI实例,并使用引用回到实际数据实例上,在该数据实例上调用诸如delete()
,modify()
等相关方法。另外,我还将传递一个对某种Factory()
类的引用,该类可以为负责添加元素的GUI元素创建数据模型的新实例。
答案 1 :(得分:0)
一个示例,用于确保l_synced
与l_original
相同,而未设置l_synced = l_original。它使用添加和删除。希望它能对您有所帮助。
class Foo:
def __init__(self, name='default'):
self.name = name
def __repr__(self):
return self.name
a = Foo(name='a')
b = Foo(name='b')
c = Foo(name='c')
d = Foo(name='d')
l_original = [a, b]
l_synced = [a, b, c]
print("Before")
print("Original: %s" % l_original)
print("Synced: %s" % l_synced)
for sync_obj in l_synced:
if sync_obj in l_original:
print("%s in l_original" % sync_obj)
else:
print("%s NOT in l_original. Remove it." % sync_obj)
l_synced.remove(sync_obj)
for orig_obj in l_original:
if orig_obj in l_synced:
print("%s in l_synced" % orig_obj)
else:
print("%s NOT in l_synced. Append it." % orig_obj)
l_synced.sppend(orig_obj)
print("After")
print("Original: %s" % l_original)
print("Synced: %s" % l_synced)
输出:
>>>python loop.py
Before
Original: [a, b]
Synced: [a, b, c]
a in l_original
b in l_original
c NOT in l_original. Remove it.
a in l_synced
b in l_synced
After
Original: [a, b]
Synced: [a, b]