Nie ma się z roztworu skrzynki, ale można spróbować czegoś takiego:
def defprop(name):
def getter(self):
return getattr(self, name)
return property(getter)
class C(object):
# ...
my_dictionary = defprop('_my_dictionary')
# ...
Że cię nie zapisać, że wiele klawiszy choć nadal trzeba powielać nazwę atrybutu. Poza tym jest mniej wyraźny.
Aktualizacja: po przemyśleniu trochę, mam wymyślić tego deskryptora oparte hackish sztuczki (disclaimer: odbywa się to tylko na pokaz, nie oznacza, że jest to dobra praktyka, chyba że mieć cholernie dobry powód, aby to zrobić):
class with_default_getter(object):
def __init__(self, func):
self._attr_name = '_{0.__name__}'.format(func)
self._setter = func
def __get__(self, obj, type):
return getattr(obj, self._attr_name)
def __set__(self, obj, value):
return self._setter(obj, value)
Zastosowanie:
class C(object):
@with_default_getter
def my_property(self, value):
print 'setting %s'
self._my_property = value
>>> c = C()
>>> c.my_property = 123
setting 123
>>> c.my_property
123
jest niemal tak samo jak @georg sugeruje, tylko rozkłada wyko mentacja do deskryptorów.
W języku Python zawsze jest krótsza droga. Myślę, że można osiągnąć coś takiego za pomocą metaklasy, ale nie sądzę, że byłoby to warte złożoności lub odchylenia od standardowego kodu. –