del
dictをループしてそれらをetingするのとは異なる動作をしますか?
ここで、MutableMapping
抽象基本クラスを実装するカスタムクラスはclear()
、「無料の」ミックスインメソッドとして取得されることに注意してください。
MutableMapping
サブクラスをインスタンス化するためにオーバーライドする必要がある唯一のメソッドは次のとおりです。
__getitem__, __setitem__, __delitem__, __iter__, __len__
データは任意の方法でマッピングクラスに保存できるため、clear()
実際にデータをクリアする方法を理解する唯一の方法は、これら5つのメソッドの1つ以上を使用することです。さて、あなたはどの方法clear()
が使われているのか推測できるかもしれませんが、なぜ私たちが実験できるのか推測するのですか?
import collections
class MyMap(collections.MutableMapping):
def __init__(self, mydict):
self._top_secret_data = mydict
def __getitem__(self, key):
print 'getitem'
return self._top_secret_data[key]
def __setitem__(self, key, value):
raise Exception('where did you want that?')
def __len__(self):
raise Exception('a gentleman never tells')
def __delitem__(self, key):
print '[shredding intensifies]'
del self._top_secret_data[key]
def __iter__(self):
def keygen():
for key in self._top_secret_data:
print 'faster! faster!'
yield key
return iter(keygen())
clear()
上で定義したクラスを使用すると、実装方法を簡単に確認できます。
>>> m = MyMap({1:'a', 2:'b', 3:'c'})
>>> m.clear()
faster! faster!
getitem
[shredding intensifies]
faster! faster!
getitem
[shredding intensifies]
faster! faster!
getitem
[shredding intensifies]
>>>
つまり、clear()
ミックスインメソッドは基本的にとして実装されfor key in self: del self[key]
ます。
さて、免責事項:などの組み込み型dict
はCで実装されているため、dict.clear
メソッドは文字通りと同じではない可能性がありますfor key in mydict: del mydict[key]
。舞台裏での最適化、おそらく完全に異なる戦略を期待しますが、この例clear()
で、Pythonでメソッドがどのように機能するかについてのアイデアが得られることを願っています。