Задача 05G. Property

Входной файл:Стандартный вход   Ограничение времени:1 сек
Выходной файл:Стандартный выход   Ограничение памяти:512 Мб
Максимальный балл:1  

Условие

Требуется реализовать на языке Python класс Property. У класса должен быть следующий интерфейс:

from __future__ import annotations
from collections.abc import Callable
from typing import Any, Generic, TypeVar

C = TypeVar('C')

class Property(Generic[C]):

    def __init__(self, getter:  Callable[[C],       Any] | None = None,
                       setter:  Callable[[C, Any], None] | None = None,
                       deleter: Callable[[C],      None] | None = None,
                       doc: str | None = None,
                       default_value: list[Any] | None = None):
        '''Property decorator, supporting getting, setting, deleting handled property.

        Generic:
    
            C: the class property is setup for

        Arguments:
    
            getter: member function that handles getting the value
            setter: member function that handles setting the value
            deleters: member function that handles deleting the value
            doc: general documentation for the property
            default_value: if setter is not None calls it with `default_value` on object initialization'''
        pass

    def getter(self, getter: Callable[[C], Any]) -> Property[C]:
        '''Adds getter to the property
        
        Arguments:
            getter: member function that handles getting the value

        Returns:
            A copy of Property with updated getter value'''
        pass

    def setter(self, setter: Callable[[C, Any], None] | None = None, default_value: Any | None = None) -> Property[C] | Callable[[Callable[[C, Any], None]], Property[C]]:
        '''Adds setter to the property
        
        Arguments:
            setter: member function that handles setting the value
            default_value: a value that is passed to `setter` on object initialization
        
        Returns:
            If `setter` is None returns a shorthand decorator function with set `default_value`.
            If `setter` is not None returns a copy of Property with updated setter and default_value arguments'''
        pass

    def deleter(self, deleter: Callable[[C], None]) -> Property:
        '''Adds deleter to the property
        
        Arguments:
            deleter: member function that handles deleting the value

        Returns:
            A copy of Property with updated deleter value'''
        pass

Класс должен повторять функционал стандартного property языка Python: позволять создавать свойства с установленными setter, getter, deleter и бросающий исключение AttributeError при попытке использования неустановленного метода со следующими сообщениями

где name это имя свойства, по которому оно доступно в классе.

В дополнение к этому появление такого свойства в классе должно после инициализации объекта добавлять к нему поле '_{name}' со значением None и единожды вызывать setter объекта со значением default_value, если свойство поддерживает присваивание.

Документация для свойства должна состоять из максимум 5-ти частей

Части в документации должны быть разделены пустой строкой (см. пример 2).

Формат выходных данных

Код решения должен содержать только импортируемые модули, определение и реализацию класса.

Примеры тестов

Стандартный вход Стандартный выход
1 class Person: @Property def name(self) -> str | None: return self._name @name.setter def name(self, name: str): self._name = name p1 = Person() p2 = Person() p2.name = 'Petya' print(p1.name) print(p2.name)
None
Petya
2 class Person: def get_name(self) -> str: '''Getter: Returns the name''' return self._name def set_name(self, name: str): '''Setter: Sets the name, must be of type str''' self._name = name def delete_name(self): '''Deleter: Sets the name to None''' self._name = None name = Property(get_name, set_name, delete_name, 'Name of a person, str', 'Vasya') p = Person() print(Person.name.__doc__) print(p.name) p.name = 'Petya' print(p.name) del p.name print(p.name)
Property 'name' on class Person

Name of a person, str

Getter:

        Returns the name

Setter:

        Sets the name, must be of type str

Deleter:

        Sets the name to None
Vasya
Petya
None

0.149s 0.013s 13