class ReadOnlyDescriptor:
def __set_name__(self, owner, name):
self.private_name = "_" + name
def __get__(self, obj, objtype=None):
return getattr(obj, self.private_name)
def __set__(self, obj, value):
raise AttributeError("Cannot set this!")
def __delete__(self, obj):
raise AttributeError("Cannot delete this!")