字典键覆盖的Python3对象方法

时间:2019-05-02 16:37:15

标签: python-3.x

我有一个继承自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()之类的基本方法,它们是只读属性。我无法将这些方法设置为只读,因为我无法控制磁盘上文件的名称,也看不到如何解决该问题。我在这里茫然。我防止通过重命名来控制文件名的目录崩溃,但这不是一个长期解决方案。

1 个答案:

答案 0 :(得分:0)

在不放弃MutableMapping的继承的情况下,我认为没有解决方法。一旦这样做,并将对self.__dict__的引用替换为对在__init__()中创建的内部字典的引用,一切正常。

以我为例,我编写了一堆测试,创建了self.items={}并更改了整个代码中的引用,无论是在测试还是在实际操作中,一切都正常运行。

但是,键总是 个字符串,因此我不清楚为什么字符串键self.__dict__["keys"]会覆盖self.__dict__.keys方法,而self.items["keys"]会不是。