现在,我正在这样做:
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__
序列的原型吗?应该怎么写?
正如@Cristian的注释中正确给出的那样,我知道的唯一标准模式是来自文档-
object .__ getitem __(self,key)
要求对实施评估
self[key]
。对于序列类型,可接受的键应为整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于该__getitem__()
方法。如果键的类型不合适,则可能引发TypeError;如果该值在该序列的索引集之外(在对负值进行任何特殊解释之后),则应引发IndexError。对于映射类型,如果缺少键(不在容器中),则应引发KeyError。
但是我在实现时遇到了另外一个问题,对于每个有效的调用__getitem__()
,都是这样的object[index]
。您每次都在创建一个新的Edge对象。
因此,每次调用时object[index]
,您都会收到一个新Edge
对象(尽管该边缘对象的内容可能相同),但是对象本身将是新的。
因此,类似的事情object[index] is object[index]
很可能会失败(结果为False)。
除非您打算这样做,否则应尝试缓存Edge对象(如果找到,则从缓存中返回)。我建议使用字典来缓存对象(由于您似乎是在动态访问中创建对象,只有在访问时才可以使用),尽管您也可以使用列表,但是只需将列表初始化为具有大小即可self.size
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句