gpt4 book ai didi

Python:如何禁止在属性字典中创建新键?

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:11 25 4
gpt4 key购买 nike

这是一个属性字典的简单代码:

class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self

更多背景: https://stackoverflow.com/a/14620633/1179925

我可以像这样使用它:

d = AttrDict({'a':1, 'b':2})
print(d)

我希望这成为可能:

d.b = 10
print(d)

但我希望这是不可能的:

d.c = 4
print(d)

是否可以在创建新 key 时抛出错误?

最佳答案

你可以检查他们是否已经在那里

class AttrDict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__dict__ = self

def __setattr__(self, key, value):
if key not in [*self.keys(), '__dict__']:
raise KeyError('No new keys allowed')
else:
super().__setattr__(key, value)

def __setitem__(self, key, value):
if key not in self:
raise KeyError('No new keys allowed')
else:
super().__setitem__(key, value)

首先,我认为这不是一个好主意,因为无法添加初始值,但从内置函数中可以看出以下内容:dict(iterable) -> 新字典初始化如下: d = {} 对于可迭代的 k,v: d[k] = v

所以这确实允许您更改方法而不影响类的初始化,因为它从 {} 而不是从它自己的实例创建一个新方法。

虽然他们总是能够改变 __ dict __ ..

关于Python:如何禁止在属性字典中创建新键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58009864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com