Я создал базовый дескриптор только для чтения:
class ReadOnlyDescriptor:
def __init__(self):
pass
def __get__(self, obj, objtype=None):
return obj._something
def __set__(self, obj, value):
raise AttributeError("Cannot set this!")
def __delete__(self, obj):
raise AttributeError("Cannot delete this!")
class Object:
something = ReadOnlyDescriptor()
def __init__(self, something='abc'):
self._something=something
И он работает в простом примере:
>>> a=Object()
>>> a.something
'abc'
>>> a.something='asdf'
AttributeError: Cannot update this!
>>> del a.something
AttributeError: Cannot delete this!
Есть ли способ сделать вышеупомянутое более общим? Например, вместо того, чтобы вызывать obj._something
в __get__
для его динамического вызова? Другими словами (кроме использования декораторов), что может быть более общим способом сделать вышеуказанное?