gpt4 book ai didi

python-2.7 - 为什么在更改列表类型数据时不调用 __setitem__?

转载 作者:行者123 更新时间:2023-12-02 01:01:48 26 4
gpt4 key购买 nike

在下面的示例中,如果通过 = 设置数据,则有一个具有 __setitem__ 方法的类可以正常工作。但是,如果例如 list 类型的数据是使用 .append 方法隐式设置的,则不会调用 __setitem__ 方法。有什么方法可以确保在设置或修改数据时调用 __setitem__(或类似“__moditem__”)?

class MyClass(object):
data = {}

def __setitem__(self, key, value):
self.data[key] = value
print "I do not like change."

def __getitem__(self, item):
return self.data[item]


c = MyClass()
c['list'] = ['hello'] #does invoke setitem
c['list'].append('world') #does not invoke __setitem__

处理这个问题的适当方法是什么?当然可以用

替换最后一行
c['list'] = c['list'] + ['world']

但是如果这个类在类库中,用户可能不知道。 :/

最佳答案

__setitem__ 仅通过以下语法调用:

obj[key] = value # this equals to obj.__setitem__(key, value)

在其他情况下,当您使用 obj[key] 时,将调用 __getitem__

例如:

class MyClass(object):
data = {}

def __setitem__(self, key, value):
self.data[key] = value
print "__setitem__ called"

def __getitem__(self, item):
print "__getitem__ called"
return self.data[item]


c = MyClass()
c['list'] = ['hello'] # __setitem__ called
c['list'].append('world') # __getitem__ called

换句话说,在你使用c['list']的最后一行,首先调用__getitem__,它返回指向上面初始化的列表['hello']的指针。之后,这个指针的append方法被调用。

关于python-2.7 - 为什么在更改列表类型数据时不调用 __setitem__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27680343/

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