Входной файл: | Стандартный вход | Ограничение времени: | 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
при попытке использования неустановленного метода со следующими сообщениями
'Cannot read {name}'
,'Cannot set {name}
,'Cannot delete {name}
,name
это имя свойства, по которому оно доступно в классе.
В дополнение к этому появление такого свойства в классе должно после инициализации объекта добавлять к нему поле '_{name}'
со значением None
и единожды вызывать setter
объекта со значением default_value
, если свойство поддерживает присваивание.
Документация для свойства должна состоять из максимум 5-ти частей
"Property '{name}' on class {cls_name}"
, где cls_name
имя класса, в который добавлено свойство.doc
, указанный при инициализации свойства, если он не равен None
.getter
, если свойство поддерживает получение значения.setter
, если свойство поддерживает присваивание.deleter
, если свойство поддерживает удаление.Код решения должен содержать только импортируемые модули, определение и реализацию класса.
№ | Стандартный вход | Стандартный выход |
---|---|---|
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)
|
|
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)
|
|