它的行为与遍历 dict 和del
eting 的行为是否不同?
这里值得注意的是,任何实现MutableMapping
抽象基类的自定义类都可以clear()
作为“免费”的 mixin 方法。
为了实例化子MutableMapping
类,您需要重写的唯一方法是:
__getitem__, __setitem__, __delitem__, __iter__, __len__
由于您可以以任何您喜欢的方式将数据存储在映射类中,唯一clear()
可以弄清楚如何实际清除数据的方法是使用这五种方法中的一种或多种。现在,您可能已经猜到使用了哪些方法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()
mixin 方法基本实现为for key in self: del self[key]
.
现在,免责声明:内置类型,例如dict
在 C 中实现,因此该dict.clear
方法可能与for key in mydict: del mydict[key]
. 我希望在幕后进行一些优化,也许是一种完全不同的策略 - 但希望这个示例能让您了解如何期望一种clear()
方法在 Python 中工作。