import copy
import traits.api
class TraitRegistryObject(traits.api.TraitDictObject):
def __setitem__(self, key, item):
print("Customized __setitem__!")
super().__setitem__(key, item)
def __deepcopy__(self, memo):
result = TraitRegistryObject(
self.trait,
lambda: None,
dict(copy.deepcopy(x, memo) for x in self.items()),
)
return result
class Registry(traits.api.Dict):
info_text = "object registry"
def validate(self, object, name, value):
if isinstance(value, dict):
if object is None:
return value
return TraitRegistryObject(self, object, name, value)
self.error(object, name, value)
class Model(traits.api.HasTraits):
registry = Registry()
if __name__ == "__main__":
model = Model()
model.registry = {} # A TraitRegistryObject() doesn't get created without this.
model.registry["abc"] = 123