class CallBackDescriptor: def __init__(self, name): self.callback_name = name def __set__(self, instance, value): assert getattr(instance, self.callback_name) is None, f"Attribute '{self.callback_name}' has been set." instance.__dict__[self.callback_name] = value def __get__(self, instance, owner): return ( self if instance is None else instance.__dict__.get(self.callback_name) )