Python中序列__getitem__的原型定义是什么?

尼尔·G

现在,我正在这样做:

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__ 序列的原型吗?应该怎么写?

阿南德·库玛(Anand S Kumar)

正如@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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在类上定义__getitem__使其在python中可迭代?

__getitem__ python中的重载

Typescript中的原型是什么?

编程中的原型是什么?

Python 3.5键入ABCMeta不会定义'__getitem__'

在python上覆盖__getitem__

Python 的 __getitem__ 的 Rust 版本

Rust中的函数原型是什么?

React中引用的正确原型是什么?

Javascript中的Function对象的原型是什么?

原型中的Java单词是什么?

Python语法中'NAME'的定义是什么

原型的目的是什么?

下标序列时,Python中的::(双冒号)是什么?

\ newline转义序列在python中是什么意思?

特殊序列的用途是什么,例如python中的\number?

隐秘的python错误'classobj'对象没有属性'__getitem__'。我为什么得到这个?

在python中使用__getitem__遍历字典

在python中使用__getitem__遍历字典

支持__getitem__的类的Python类型提示

覆盖Python元类__getitem__

Python 8puzzle'__getitem__'错误

在__getitem__中实现切片

TypeError:在Python中解析XML时,“类型”对象没有属性“ __getitem__”

Python-更新SqlServer中的XML行(TypeError:“类型”对象没有属性“ __getitem__”)

在__getitem__ Python 2.7中将int转换为str

Python TypeError:“ NoneType”对象在图像处理中没有属性“ __getitem__”

'builtin_function_or_method'对象在python中没有属性'__getitem__'错误

“可迭代”在Python中到底是什么意思?为什么我的实现__getitem __()的对象不是可迭代的?