如何使列表中的项与对象相对应?

2024-06-26 13:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在做一个利用PyQt的项目。在这个项目中,我们正在处理对“模块”(我们称之为模块)的一些更改。其中一些更改被转发到父类中的列表。最重要的一点是,这些更改与列表中的项目保持一致。你知道吗

36568444-47afedf0-17e7-11e8-8ae9-775cadd54d66

下面是一些代码的一个小例子,这些代码已经被用来适应我正在尝试做的事情。你知道吗

class Module:
    some_list = []

    def setList(self, _list, _item):
        try:
            _list[_list.index(_item)] = _item
        except:
            _list.append(_item)


class someUI(Module):
    index = 0
    def __init__(self):
        super().__init__()

    def setList(self, _list, _item):
        super().setList(_list, _item)


f = someUI()
g = someUI()
f.setList(f.some_list, 'item1')
g.setList(g.some_list, 'item2')

如您所见,我添加了一个列表some_list,任何扩展Module类的类都可以访问该列表。 预期的结果应该是,每当我们添加新模块(由fg给出)时,它们在some_list中的相应空间都应该被记住。你知道吗

换句话说,当一个新的“模块”被添加时,一个新的空间应该被添加到some_list。每当编辑“module”时,我们只希望some_list中的相应项发生更改。 例如:如果我正在处理f,那么相应的位置some_list[0]应该是唯一发生变化的地方。如果我在处理g,那么相应的位置some_list[1]应该是事情发生变化的唯一地方。但是,如果some_list[0]中不存在任何内容,那么我们就要创建它。正如您所看到的setList是这样做的一种尝试。你知道吗

当我们添加新的项和类时,这应该保持一致。基本上,我们希望将some_list的索引和每个新对象的实例化绑定在一起。你知道吗

class anotherUI(Module):
     ...

h = anotherUI()
h.setList(h.some_list, 'item3')

再胡闹一点之后,我发现我可以用字典来做我想做的事。你知道吗

class Module:
    some_list = {}

    def setItem(self, name, item):
        self.some_list[name] = item


class someUI(Module):
    index = -1

    def __init__(self):
        super().__init__()
        someUI.index += 1
        self.curr_count = someUI.index

    def setItem(self, _item, **kwargs):
        super().setItem(self.curr_count, _item)


f = someUI()
g = someUI()
f.setItem('item1')
g.setItem('item2')
f.setItem('item3')

Output: 
{0: 'item3', 1: 'item2'}

然而,出现了一个新问题。如何添加一个新类,并让它认识到它不应该覆盖字典中的项?你知道吗

class anotherUI(Module):
     ...

h = anotherUI()
h.setList('item3')

Output
{0: 'item3', 1: 'item2', 2: 'item3'}

Tags: 模块self列表indexinitdefsomeitem