gpt4 book ai didi

python - 为什么 __getitem__ 不能是类方法?

转载 作者:太空狗 更新时间:2023-10-29 17:02:01 24 4
gpt4 key购买 nike

假设下面的类:

class Class(object):
@classmethod
def getitem(*args):
print 'getitem %s' % (args,)
@classmethod
def __getitem__(*args):
print '__getitem__ %s' % (args,)

getitem 方法的行为符合预期:它接收 Class 作为第一个 arg,但是 __getitem__ 接收 type 作为第一个 arg:

calling Class.getitem(test)
getitem (<class '__main__.Class'>, 'test')

calling obj.getitem(test)
getitem (<class '__main__.Class'>, 'test')

calling Class[test]
'type' object has no attribute '__getitem__'

calling obj[test]
__getitem__ (<class '__main__.Class'>, 'test')

__getitem__ 背后的魔法是什么?

最佳答案

特殊方法是在类中查找的,而不是在实例中查找的——这与首先在实例中查找的常规方法不同。参见 Special method lookup在 Python 数据模型文档中。

Class 视为 type 的实例,这意味着当您这样做时

Class.getitem(test)

它首先准确查找您告诉它的内容:Class 自己的属性中称为 getitem 的方法。但是,当你使用

Class[test]

它跳过这个,直接进入type(是Class的类,或者它的元类),然后调用type.__getitem__(Class,测试)。所以,发生的事情不是 __getitem__ 获取 type 作为它的第一个参数(它仍然会获取 Class,就像你显式 Class.__getitem__(test)), 是Python在这种情况下寻找的__getitem__不存在。要使其存在,您需要为 Class 定义自己的元类,将其定义为实例方法,而不是在 Class 上将其定义为类方法。

关于python - 为什么 __getitem__ 不能是类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12447036/

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