我需要列表的某些特殊情况,其中列表项会知道(具有属性/属性),它告诉:
- 该项是否为列表中的最后一项
- 他们在列表中的索引或"枚举器"
我能想到的方法有:
- 覆盖
__setitem__
、__add__
、insert
、append
、pop
等。 - 不要将它们存储在 python 列表中,而是有一个指向下一项的"next"属性。
- 添加帮助程序函数以在评估之前(或更新后)同步索引属性
- 不要将它们存储为属性,而是在类"外部"处理它
1)似乎是大多数pythonic方法,但需要覆盖相当多的方法。2)存在必须重新实现上述方法的问题(如果我想insert()
或pop()
,则对索引没有真正的帮助)3)&4)有"你必须记得在做Y之前打电话给X"的陷阱
上述列表中的所有项目将(或应该)始终是同一类的实例。
是否有已知的设计模式或我不知道的pythonic方法?
我同意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
我对列表的某些特殊情况有要求,其中列表项会知道(具有属性/属性),它告诉: 项目是否为列表中的最后一项;[和] 他们在列表中的索引或"枚举器"
不,你没有。您需要代码的其他部分适当地处理最后一个元素,或使用索引。
没有干净的方法来执行您的要求,因为跟踪这些事情应该是列表对象的责任。列表项最多应该有一个保存其父列表的属性,但即便如此,我也不建议这样做。
重写代码以保留对列表的引用。