gpt4 book ai didi

python - Python 中序列 __getitem__ 的原型(prototype)定义是什么?

转载 作者:行者123 更新时间:2023-11-28 18:36:03 25 4
gpt4 key购买 nike

现在,我正在这样做:

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

这是原型(prototype) __getitem__ 一个序列吗?应该怎么写?

最佳答案

正如 @Cristian 的评论中正确给出的那样,我所知道的唯一标准模式来自 documentation -

object.__getitem__(self, key)

Called to implement evaluation of self[key]. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the __getitem__() method. If key is of an inappropriate type, TypeError may be raised; if of a value outside the set of indexes for the sequence (after any special interpretation of negative values), IndexError should be raised. For mapping types, if key is missing (not in the container), KeyError should be raised.

但是我在您的实现中看到了另一个问题,对于 __getitem__() 的每次有效调用,都是针对 object[index] 之类的。您每次都在创建一个新的 Edge 对象。

因此每次调用 object[index] 时,您都会收到一个新的 Edge 对象(尽管该 edge 对象的内容可能相同),但对象本身会是新的。

所以像 - object[index] is object[index] 这样的事情很可能会失败(结果为 False)。

除非这是您想要的,否则您应该尝试缓存 Edge 对象(如果找到则从缓存中返回)。我建议使用字典来缓存对象(因为你似乎是在动态创建对象,只有在访问时),虽然你也可以使用列表,但你只需要将列表初始化为 self.size .

关于python - Python 中序列 __getitem__ 的原型(prototype)定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32449328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com