Python __setitem__ 使用多个键时发生奇怪的事情
Strange thing when Python __setitem__ use multiple key
我不想在使用时测试密钥类型__setitem__
。但奇怪的是,我发现使用多个键时,部分代码被省略了。这是我的测试 class:
class foo():
def __init__(self):
self.data=[[1,2],[3,4],[5,6]]
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
print('Key is {0}, type of key is {1}'.format(key,type(key)))
self.data[key] = value
f = foo()
使用一键就可以:
>>>f[1] = [0,0]
Key is 1, type of key is <class 'int'>
>>>f[1]
[0, 0]
当使用两个键时,结果是正确的,但是为什么什么也没有打印出来
>>>f[1][1] = 100
>>>f[1][1]
100
我是python的新人任何建议都将不胜感激!
f[1][1] = 0
等同于
f.__getitem__(1).__setitem__(1, 0)
它在您的自定义 class 上调用 __getitem__
;这个 returns [0, 0]
或 [3, 4]
或存储在 f[1]
中的任何内容;在任何情况下,这个值都是一个普通的 Python list
;然后在 list
上调用 __setitem__
。 list.__setitem__
不打印任何内容。
f[1]
调用您的 __getitem__
,因此 returns 是一个列表([3,4]
在新初始化对象的情况下)。然后,第二个索引操作 f[1][1]
索引返回的对象,列表 [3,4]
,它不是您的 class 的实例,而只是一个列表类型(由您的 class).
我不想在使用时测试密钥类型__setitem__
。但奇怪的是,我发现使用多个键时,部分代码被省略了。这是我的测试 class:
class foo():
def __init__(self):
self.data=[[1,2],[3,4],[5,6]]
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
print('Key is {0}, type of key is {1}'.format(key,type(key)))
self.data[key] = value
f = foo()
使用一键就可以:
>>>f[1] = [0,0]
Key is 1, type of key is <class 'int'>
>>>f[1]
[0, 0]
当使用两个键时,结果是正确的,但是为什么什么也没有打印出来
>>>f[1][1] = 100
>>>f[1][1]
100
我是python的新人任何建议都将不胜感激!
f[1][1] = 0
等同于
f.__getitem__(1).__setitem__(1, 0)
它在您的自定义 class 上调用 __getitem__
;这个 returns [0, 0]
或 [3, 4]
或存储在 f[1]
中的任何内容;在任何情况下,这个值都是一个普通的 Python list
;然后在 list
上调用 __setitem__
。 list.__setitem__
不打印任何内容。
f[1]
调用您的 __getitem__
,因此 returns 是一个列表([3,4]
在新初始化对象的情况下)。然后,第二个索引操作 f[1][1]
索引返回的对象,列表 [3,4]
,它不是您的 class 的实例,而只是一个列表类型(由您的 class).