Как синхронизировать список экземпляров с оригинальным списком экземпляров в Python? - PullRequest
0 голосов
/ 23 мая 2019

У меня есть класс диспетчера данных, который содержит оригинальный список экземпляров данных. У меня также есть класс GUI, который содержит элементы GUI для каждого из этих экземпляров. Мне нужно синхронизировать список GUI с исходным списком, когда происходит событие.

Мне кажется, что есть лучшее, более элегантное решение, чем циклический просмотр обоих списков для добавления () и удаления () определенных экземпляров.

Редактировать: пример будет

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.

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Пример того, чтобы убедиться, что 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]
0 голосов
/ 23 мая 2019

Я бы оставил ссылку в модели графического интерфейса на экземпляр данных.Затем, когда происходит событие, я перебираю все экземпляры GUI и, используя ссылку на реальный экземпляр данных, вызываю на указанном экземпляре данных соответствующий метод, такой как delete(), modify() и т. Д. Также я передаю ссылку на какой-то видкласса Factory(), который может создавать новые экземпляры модели данных для элемента GUI, отвечающего за добавление элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...