这里有一个list
子类,它将其项委托给^{
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__
protcol用一个参数调用了compress
?你知道吗
函数可以用作方法,因为它具有
__get__
属性。类compress
没有__get__
属性:因此不能成为一种方法。你知道吗
使用
__get__
方法调用属性时,将调用__get__
方法并返回其返回值,而不是属性本身的值。也就是说,l[0] == l.__getitem__(0) == l.__getitem__.__get__(l, type(l))(0)
,其中__get__
的返回值是已经将l
传递给函数的对象。你知道吗(如果您曾经想知道
classmethod
和staticmethod
修饰符是做什么的,它们用不同的__get__
方法返回对象。)相关问题 更多 >
编程相关推荐