gpt4 book ai didi

python - 为什么不能将一个类分配给 __getitem__ 工作?

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:28 24 4
gpt4 key购买 nike

这是一个 list 子类,它将其项目委托(delegate)给 itertools.compress .

from itertools import compress

class WeirdList(list):
def __getitem__(self, item):
return compress(self, item)

l = WeirdList([1, 2, 3, 4])
print(*l[0, 1, 0, 1]) # 2 4

上面的工作正常,虽然我的印象是我可以直接将 compress 分配给 __getitem__

class WeirdList(list):
__getitem__ = compress

l = WeirdList([1, 2, 3, 4])
print(*l[0, 1, 0, 1])

这引发了以下问题:

Traceback (most recent call last):
File "...", line 7, in <module> print(*l[0, 1, 0, 1])
TypeError: Required argument 'selectors' (pos 2) not found

我相信这会中断,因为 compress 是一个类而不是函数,但消息显示 TypeError 是从调用 compress 引发的。

__getitem__ 协议(protocol)在什么时候用一个参数调用compress

最佳答案

函数可以用作方法,因为它具有__get__ 属性。 compress 没有__get__ 属性:

>>> compress.__get__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'itertools.compress' has no attribute '__get__'

因此不能成为方法。

当使用 __get__ 方法调用属性时,将调用 __get__ 方法并返回其返回值,而不是属性本身的值。即l[0] == l.__getitem__(0) == l.__getitem__.__get__(l, type(l))(0),其中__get__的返回值 是一个已经将 l 传递给函数的对象。

(如果您曾经想知道 classmethodstaticmethod 装饰器的作用,它们会返回具有不同 __get__ 方法的对象。)

关于python - 为什么不能将一个类分配给 __getitem__ 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54671923/

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