gpt4 book ai didi

python - 迭代类对象

转载 作者:行者123 更新时间:2023-11-28 20:52:38 25 4
gpt4 key购买 nike

这不是真实世界的程序,但我想知道为什么它不能完成。

我在考虑 numpy.r_ 对象并尝试做类似的事情,但只是创建一个类并且不实例化它

整数的简单代码(有一些缺陷)可以是:

class r_:
@classmethod
def __getitem__(clc, sl):
try:
return range(sl)
except TypeError:
sl = sl.start, sl.stop, sl.step
return range(*(i for i in sl if i is not None))

但是当我尝试执行 r_[1:10] 时,我收到了 TypeError: 'type' object is not subscriptable

当然,代码可以与 r_.__getitem__(slice(1,10)) 一起使用,但这不是我想要的。

在这种情况下,我可以做些什么来代替 r_()[1:10] 吗?

最佳答案

解析obj[index]的协议(protocol)是在objtype中寻找__getitem__方法>,直接在 obj 上查找方法(如果 obj 没有,通常会回退到在类型上查找方法'没有名称为 __getitem__ 的实例属性。

这很容易验证。

>>> class Foo(object):
pass

>>> def __getitem__(self, index):
return index

>>> f = Foo()
>>> f.__getitem__ = __getitem__
>>> f[3]
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
f[3]
TypeError: 'Foo' object does not support indexing
>>> Foo.__getitem__ = __getitem__
>>> f[3]
3

我不知道为什么它会以这种方式工作,但我猜至少部分原因是为了防止你试图做的事情;如果每个定义了 __getitem__ 以使其实例可索引的类意外地获得了自身被索引的能力,那将是令人惊讶的。在绝大多数情况下,尝试索引类的代码将是一个错误,因此如果 __getitem__ 方法碰巧能够返回一些东西,如果没有被捕获那将是糟糕的.

你为什么不直接调用这个类,然后将它的一个实例绑定(bind)到名称 r_ 上?然后你就可以执行 r_[1:10]

关于python - 迭代类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406519/

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