Вы можете проверить, есть ли они там уже
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(итерируемый) -> новый словарь инициализируется, как если бы через: d = {} для k, v в итерируемом: d [k] = v
Так что это позволяет вам изменять методы без ихвлияет на инициализацию класса, поскольку он создает новый из {} вместо своего собственного экземпляра.
Они смогут менять __дикт __ всегда, хотя ..