シーケンス タイプ__setitem__
への割り当てには、Python のマジック メソッドがあります。コンテナー レベルでの拡張代入のための魔法の方法はありますか? この操作は、item-type の拡張された割り当てにうまく分割されているように見えます。それは論理的です。しかし、他のほとんどすべてのものには魔法のメソッドがあります。シーケンス型のこれらの演算子には一連のメソッドが必要だと思いました。私はそれを逃しましたか?=
+=
アプリケーションは一種のデータベースです。__getitem__
SELECT と__setitem__
INSERTを使用して実装することを考えてください。__additem__
UPDATEにはetc.のようなものがあるはずですよね?
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
挿入は次のとおりです。
>>> 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 フィドルで試すことができます: http://pythonfiddle.com/add-item-for-sequence/
関連する質問は、の逆コンパイルを示していますself[key] += value