我有一个继承自MutableMapping的对象;它有
def __setitem__(self,key,value):
self.__dict__[key]=value
条目的命名与从os.listdir()扩展名 返回的名称完全相同。文件spam.tgz创建一个带有关键字“ spam”的条目。 “ spam.png”使用相同的键,但是将值转换为列表:[“ tgz”,“ png”,]。
对象具有如下方法:
def keys(self):
return list(self.__dict__.keys())
例如,当存在一个名为“ keys.tgz”的文件时,就会出现问题。 __setitem()创建一个名为“ keys”的条目,该条目将覆盖上面显示的keys()方法。碰巧在目录中具有文件名的任何方法都将被覆盖,从而带来各种麻烦。
使用常规字典不会出现此问题,因为不能覆盖诸如key()之类的基本方法,它们是只读属性。我无法将这些方法设置为只读,因为我无法控制磁盘上文件的名称,也看不到如何解决该问题。我在这里茫然。我防止通过重命名来控制文件名的目录崩溃,但这不是一个长期解决方案。
答案 0 :(得分:0)
在不放弃MutableMapping的继承的情况下,我认为没有解决方法。一旦这样做,并将对self.__dict__
的引用替换为对在__init__()
中创建的内部字典的引用,一切正常。
以我为例,我编写了一堆测试,创建了self.items={}
并更改了整个代码中的引用,无论是在测试还是在实际操作中,一切都正常运行。
但是,键总是 个字符串,因此我不清楚为什么字符串键self.__dict__["keys"]
会覆盖self.__dict__.keys
方法,而self.items["keys"]
会不是。