Python中有一个神奇的方法__setitem__
,用于对序列类型进行赋值操作=
。在容器级别上,是否有增强赋值操作+=
的魔术方法呢?这个操作似乎可以优雅地降级为项类型的增强赋值操作。这是合理的。但几乎所有其他操作都有一个魔术方法,我认为在序列类型中应该有一组这些运算符的方法。我错过了吗?
应用程序是一种数据库。考虑使用SELECT实现__getitem__
,使用INSERT实现__setitem__
。应该有类似__additem__
等用于UPDATE的方法,对吧?
from __future__ import print_function
class Item(object):
def __init__(self, value):
self.value = value
def __str__(self):
return "Item " + str(self.value)
def __iadd__(self, other):
print("Item iadd", self, other)
return Item(self.value + "+" + other.value)
class Container(object):
def __getitem__(self, key):
print("Container getitem", key)
return Item(key)
def __setitem__(self, key, value):
print("Container setitem", key, value)
return self
def __additem__(self, key, value):
print("Container additem would be nice", key, value)
return self
这是 SELECT 语句:
>>> c = Container()
>>> _ = c['key']
Container getitem key
这里是INSERT语句:
>>> c['key'] = Item('other')
Container setitem key Item other
如何实现UPDATE?而不是将其分解为SELECT和INSERT:
>>> c['key'] += Item('other')
Container getitem key
Item iadd Item key Item other
Container setitem key Item key+other
有没有一种实现增强赋值的方法不需要将所有行为都放在Item类中,而不是分解步骤?
您可以将上述代码复制并粘贴到Python解释器中,或者在此Python fiddle上尝试: http://pythonfiddle.com/add-item-for-sequence/
相关问题展示了self[key] += value
的反编译过程。