class Property:
"""Дескриптор, реализующий основные возможности функции property."""
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget # функция-геттер
self.fset = fset # функция-сеттер
self.fdel = fdel # функция-делетер
self.__doc__ = doc # описание свойства
def __get__(self, client_obj, client_cls=None):
"""Геттер на основе заданной функции."""
# При вызове атрибута из класса возвращает объект дескриптора
if client_obj is None:
return self
# При отсутствии функции-геттера вызывается исключение
if self.fget is None:
raise AttributeError("Невозможно получить значение")
# Возвращение результата работы функции-геттера
return self.fget(client_obj)
def __set__(self, client_obj, value):
"""Сеттер на основе заданной функции."""
# При отсутствии функции-сеттера вызывается исключение
if self.fset is None:
raise AttributeError("Невозможно присвоить значение")
# Запуск работы функции-сеттера
self.fset(client_obj, value)
def __delete__(self, client_obj):
"""Делетер на основе заданной функции."""
# При отсутствии функции-делетера вызывается исключение
if self.fdel is None:
raise AttributeError("Невозможно удалить атрибут")
# Запуск функции-делетера
self.fdel(client_obj)# your code goes here
Y2xhc3MgUHJvcGVydHk6CiAgICAiIiLQlNC10YHQutGA0LjQv9GC0L7RgCwg0YDQtdCw0LvQuNC30YPRjtGJ0LjQuSDQvtGB0L3QvtCy0L3Ri9C1INCy0L7Qt9C80L7QttC90L7RgdGC0Lgg0YTRg9C90LrRhtC40LggcHJvcGVydHkuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmdldD1Ob25lLCBmc2V0PU5vbmUsIGZkZWw9Tm9uZSwgZG9jPU5vbmUpOgogICAgICAgIHNlbGYuZmdldCA9IGZnZXQgICMg0YTRg9C90LrRhtC40Y8t0LPQtdGC0YLQtdGACiAgICAgICAgc2VsZi5mc2V0ID0gZnNldCAgIyDRhNGD0L3QutGG0LjRjy3RgdC10YLRgtC10YAKICAgICAgICBzZWxmLmZkZWwgPSBmZGVsICAjINGE0YPQvdC60YbQuNGPLdC00LXQu9C10YLQtdGACiAgICAgICAgc2VsZi5fX2RvY19fID0gZG9jICAjINC+0L/QuNGB0LDQvdC40LUg0YHQstC+0LnRgdGC0LLQsAoKICAgIGRlZiBfX2dldF9fKHNlbGYsIGNsaWVudF9vYmosIGNsaWVudF9jbHM9Tm9uZSk6CiAgICAgICAgIiIi0JPQtdGC0YLQtdGAINC90LAg0L7RgdC90L7QstC1INC30LDQtNCw0L3QvdC+0Lkg0YTRg9C90LrRhtC40LguIiIiCiAgICAgICAgIyDQn9GA0Lgg0LLRi9C30L7QstC1INCw0YLRgNC40LHRg9GC0LAg0LjQtyDQutC70LDRgdGB0LAg0LLQvtC30LLRgNCw0YnQsNC10YIg0L7QsdGK0LXQutGCINC00LXRgdC60YDQuNC/0YLQvtGA0LAKICAgICAgICBpZiBjbGllbnRfb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgIyDQn9GA0Lgg0L7RgtGB0YPRgtGB0YLQstC40Lgg0YTRg9C90LrRhtC40Lgt0LPQtdGC0YLQtdGA0LAg0LLRi9C30YvQstCw0LXRgtGB0Y8g0LjRgdC60LvRjtGH0LXQvdC40LUKICAgICAgICBpZiBzZWxmLmZnZXQgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoItCd0LXQstC+0LfQvNC+0LbQvdC+INC/0L7Qu9GD0YfQuNGC0Ywg0LfQvdCw0YfQtdC90LjQtSIpCiAgICAgICAgIyDQktC+0LfQstGA0LDRidC10L3QuNC1INGA0LXQt9GD0LvRjNGC0LDRgtCwINGA0LDQsdC+0YLRiyDRhNGD0L3QutGG0LjQuC3Qs9C10YLRgtC10YDQsAogICAgICAgIHJldHVybiBzZWxmLmZnZXQoY2xpZW50X29iaikKCiAgICBkZWYgX19zZXRfXyhzZWxmLCBjbGllbnRfb2JqLCB2YWx1ZSk6CiAgICAgICAgIiIi0KHQtdGC0YLQtdGAINC90LAg0L7RgdC90L7QstC1INC30LDQtNCw0L3QvdC+0Lkg0YTRg9C90LrRhtC40LguIiIiCiAgICAgICAgIyDQn9GA0Lgg0L7RgtGB0YPRgtGB0YLQstC40Lgg0YTRg9C90LrRhtC40Lgt0YHQtdGC0YLQtdGA0LAg0LLRi9C30YvQstCw0LXRgtGB0Y8g0LjRgdC60LvRjtGH0LXQvdC40LUKICAgICAgICBpZiBzZWxmLmZzZXQgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoItCd0LXQstC+0LfQvNC+0LbQvdC+INC/0YDQuNGB0LLQvtC40YLRjCDQt9C90LDRh9C10L3QuNC1IikKICAgICAgICAjINCX0LDQv9GD0YHQuiDRgNCw0LHQvtGC0Ysg0YTRg9C90LrRhtC40Lgt0YHQtdGC0YLQtdGA0LAKICAgICAgICBzZWxmLmZzZXQoY2xpZW50X29iaiwgdmFsdWUpCgogICAgZGVmIF9fZGVsZXRlX18oc2VsZiwgY2xpZW50X29iaik6CiAgICAgICAgIiIi0JTQtdC70LXRgtC10YAg0L3QsCDQvtGB0L3QvtCy0LUg0LfQsNC00LDQvdC90L7QuSDRhNGD0L3QutGG0LjQuC4iIiIKICAgICAgICAjINCf0YDQuCDQvtGC0YHRg9GC0YHRgtCy0LjQuCDRhNGD0L3QutGG0LjQuC3QtNC10LvQtdGC0LXRgNCwINCy0YvQt9GL0LLQsNC10YLRgdGPINC40YHQutC70Y7Rh9C10L3QuNC1CiAgICAgICAgaWYgc2VsZi5mZGVsIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCLQndC10LLQvtC30LzQvtC20L3QviDRg9C00LDQu9C40YLRjCDQsNGC0YDQuNCx0YPRgiIpCiAgICAgICAgIyDQl9Cw0L/Rg9GB0Log0YTRg9C90LrRhtC40Lgt0LTQtdC70LXRgtC10YDQsAogICAgICAgIHNlbGYuZmRlbChjbGllbnRfb2JqKSMgeW91ciBjb2RlIGdvZXMgaGVyZQ==