【发布时间】:2016-04-02 09:06:34
【问题描述】:
有一个 Python 魔术方法 __setitem__ 用于将 = 分配给序列类型。 在容器级别是否有用于增强分配+= 的神奇方法?该操作似乎可以优雅地分解为项目类型的增强分配。这是合乎逻辑的。但是几乎所有其他事情都有一个神奇的方法,我认为应该有一组方法用于序列类型上的这些运算符。我错过了吗?
应用程序是一种数据库。考虑用 SELECT 实现 __getitem__,用 INSERT 实现 __setitem__。 UPDATE应该有__additem__之类的东西,对吧?
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
这是选择:
>>> c = Container()
>>> _ = c['key']
Container getitem key
这是插入:
>>> 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/
一个related question显示了self[key] += value的反编译
【问题讨论】:
标签: python containers sequence magic-methods augmented-assignment