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