1

我需要列表项的某些特殊情况列表(具有属性/属性),它告诉:

  • 该项目是否是列表中的最后一项
  • 他们在列表中的索引或“枚举数”

我能想到的方法是:

  1. 覆盖__setitem__, __add__, insert, append,pop等。人
  2. 不要将它们存储在 python 列表中,而是有一个指向下一个项目的“下一个”属性。
  3. 添加辅助函数以在评估之前(或更新之后)同步索引属性
  4. 不要将它们存储为属性,而是在类“外部”处理它

1) 似乎是大多数 pythonic 方法,但需要覆盖相当多的方法。insert()2) 有必须重新实现上述方法的问题(如果我愿意,对索引并没有真正的帮助pop()) 3) & 4) 有“你必须记住在做 Y 之前调用 X”的陷阱

上述列表中的所有项目将(或应该)始终是同一类的实例。

是否有已知的设计模式或我不知道的pythonic方法?

4

2 回答 2

3

我同意 Marcin 的观点,因为你不应该需要这个。但是无论出于什么模糊的原因,如果你真的真的真的需要这个功能,这里是一个不错的开始:

class Node:
    def __init__(self, data):
        self.data = data
        self.index = 0
        self.next = None

class myContainer:
    def __init__(self, node):
        self.head = node
        self.length = 1
    def __setitem__(self, i, node):
        if i > self.length:
            raise ValueError("Index %s is too large. Cannot set item at that index. Current container length is %s" %(i, self.length))
        curr = self.head
        while i>0:
            curr = curr.next
            curr.next, node.next = node, curr.next
            node.index = curr.index + 1
        curr = node.next
        while curr is not None:
            curr.index += 1
            curr = curr.next
于 2013-09-10T19:31:37.670 回答
2

我对列表项的某些特殊情况有要求(具有属性/属性),它告诉:该项目是否是列表中的最后一项;[和]它们在列表中的索引或“枚举器”

不,你没有。您需要代码的其他部分适当地处理最后一个元素,或使用索引。

没有干净的方法可以按照您的要求进行操作,因为列表对象应该负责跟踪这些事情。列表项最多应该有一个保存其父列表的属性,但即使那样我也不建议这样做。

重写您的代码以保留对列表的引用。

于 2013-09-10T19:28:13.370 回答