现在,我正在这样做:
class EdgesGenerator(abc.Sequence):
def __init__(self, link, size):
self.link = link
self.size = size
def __getitem__(self, cluster_index):
try:
index = cluster_index.__index__()
except AttributeError:
raise TypeError from None
if 0 <= index < self.size:
return Edge(self.link, index)
raise IndexError
def __len__(self):
return self.size
这是序列的典型__getitem__
吗?怎么写呢?
答案 0 :(得分:1)
正如@Cristian在评论中正确给出的那样,我所知道的唯一标准模式来自documentation -
object .__ getitem __(self,key)
被要求实施
self[key]
的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于__getitem__()
方法。如果key是不合适的类型,则可能引发TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应引发IndexError。对于映射类型,如果缺少键(不在容器中),则应引发KeyError。
但是我的实施中还有另一个问题,对于__getitem__()
的每次有效调用,都是object[index]
之类的问题。您每次都在创建一个新的Edge对象。
因此,每当您调用object[index]
时,您将收到一个新的Edge
对象(尽管该边缘对象的内容可能相同),但该对象本身将是新的。
因此 - object[index] is object[index]
之类的东西很可能会失败(会导致False)。
除非您打算这样做,否则您应该尝试缓存Edge对象(如果找到则从缓存返回)。我建议使用字典来缓存对象(因为你似乎只是在访问时动态创建对象),虽然你也可以使用列表,你只需要将列表初始化为{{1 }。