Задача 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.056s 0.010s 13