Вы можете сделать это следующим образом:
from collections import UserDict
class MyDict(UserDict):
def __setitem__(self, key, value):
if value > 10: # any validation
raise ValueError('Too big!')
super().__setitem__(key, value)
Но будет лучше использовать класс с property
.
Полная версия:
from collections import UserDict
from math import sqrt
class VectorDict(UserDict):
def __init__(self, *args, speed_limit, **kwargs):
self.speed_limit = speed_limit
super().__init__(*args, **kwargs)
def __setitem__(self, key, value):
if self._calc_speed(key, value) > self.speed_limit:
raise ValueError('Too big!')
super().__setitem__(key, value)
def _calc_speed(self, replace_key=None, replace_value=0):
square_sum = 0
for key, value in self.items():
if key == replace_key:
value = replace_value
square_sum += value ** 2
return sqrt(square_sum)
@property
def speed(self):
return self._calc_speed()
example_1d = VectorDict(x=1, speed_limit=5)
example_2d = VectorDict(x=1, y=5, speed_limit=7)
example_3d = VectorDict(x=1, y=5, z=3, speed_limit=13)
print(example_3d.speed)
example_3d['x'] += 10 # ValueError: Too big!