Python 假设我想实现一个InsertOnlyDict,那么';实施它的最佳方式是什么?

Python 假设我想实现一个InsertOnlyDict,那么';实施它的最佳方式是什么?,python,Python,我在想我们如何实现一个InsertOnlyDict,它的属性是,如果一个键已经存在,它就不能被设置为新值 实现它的一种方法是编写如下内容: class InsertOnlyDict(dict): 定义设置项(自身、键、值): 如果键入self: 提高。。。。 super(InsertOnlyDict,self)。\uuuu设置项\uuuuu(键,值) 上述方法存在的问题是,如果调用方使用dict.\uuuuu setitem\uuuuuu(x,k,v),它仍然可以更新此项 第二种方法是写 cl

我在想我们如何实现一个
InsertOnlyDict
,它的属性是,如果一个键已经存在,它就不能被设置为新值

实现它的一种方法是编写如下内容:

class InsertOnlyDict(dict):
定义设置项(自身、键、值):
如果键入self:
提高。。。。
super(InsertOnlyDict,self)。\uuuu设置项\uuuuu(键,值)
上述方法存在的问题是,如果调用方使用
dict.\uuuuu setitem\uuuuuu(x,k,v)
,它仍然可以更新此项

第二种方法是写

class InsertOnlyDict(对象):
__插槽(内部插槽)
定义初始化(self,*args,**kwargs):
self._internal=dict(*args,**kwargs):
定义设置项(自身、键、值):
如果输入self.\u internal:
提高。。。。
self.\u内部[键]=值
这种方法最令人担忧的是,这种
InsertOnlyDict
不再是
dict
,因此可能会导致检查失败,如
isinstance(x,dict)

有什么办法绕过它吗?e、 g.使一个类不真正使用父类,同时仍然通过检查,如
isinstance(x,dict)


你觉得这些方法怎么样?

不,如果你想使用dict,你必须接受dict可以做你不想让他们做的事情。在这种情况下,测试
isinstance(x,dict)
是不正确的,因为如果
x
是dict的一个实例,那么dict方法将对它起作用。请看一看您提到的“上面的方法有一个问题,即如果调用方使用dict.setitem(x,k,v),它仍然可以更新它”。但这就是Python的哲学。您不必编写一个阻止程序员有目的地实现某些目标的解决方案。你已经阻止了非自愿的重新分配,我认为这就是你需要做的……你必须实现
update()
setdefault()
too我认为不太可能有人会在上面使用
dict.\uu setitem.\uuuuuu(x,k,v)
(实际上需要类似于
dict.\uu setitem.\uuuu(iod\u对象,x,k,v)
)-我也会这样做。同样,对于其他方法,也需要重写。不,如果你想使用dict,你必须接受dict可以做你不想做的事情。在这种情况下,测试
isinstance(x,dict)
是不正确的,因为如果
x
是dict的一个实例,那么dict方法将对它起作用。请看一看您提到的“上面的方法有一个问题,即如果调用方使用dict.setitem(x,k,v),它仍然可以更新它”。但这就是Python的哲学。您不必编写一个阻止程序员有目的地实现某些目标的解决方案。你已经阻止了非自愿的重新分配,我认为这就是你需要做的……你必须实现
update()
setdefault()
too我认为不太可能有人会在上面使用
dict.\uu setitem.\uuuuuu(x,k,v)
(实际上需要类似于
dict.\uu setitem.\uuuu(iod\u对象,x,k,v)
)-我也会这样做。同样,对于其他也需要重写的方法。