通常情況下,我可以不管三七二十一猴子補丁和模擬方法:爲什麼能在collections.MutableMapping的一個子類不是我猴子補丁__setitem__
from UserDict import DictMixin
class py2fake_dict(DictMixin):
def __setitem__(self, name, value):
raise AssertionError("Don't talk to me!")
def __delitem__(self, name):
pass
def __getitem__(self, name):
pass
def __iter__(self):
yield None
def __len__(self):
return 0
c = py2fake_dict()
c.__setitem__ = lambda name, value: 'All clear.'
# This is OK:
c[1] = 2
但是,如果有問題的方法是在MutableMapping子,我不能:
from collections import MutableMapping
class py3fake_dict(MutableMapping):
def __setitem__(self, name, value):
raise AssertionError("Don't talk to me!")
def __delitem__(self, name):
pass
def __getitem__(self, name):
pass
def __iter__(self):
yield None
def __len__(self):
return 0
c = py3fake_dict()
c.__setitem__ = lambda name, value: 'All clear.'
# This hits the assertion!!!
c[1] = 2
我從UserDict.DictMixin
升級到collections.MutableMapping
作爲我們Python3升級的一部分,當看到這個工作的代碼。我將刪除代碼,或將來使用子類,但我只想了解發生了什麼。