66 lines
2.8 KiB
Python
66 lines
2.8 KiB
Python
"""
|
||
https://stepik.org/lesson/701986/step/5?unit=702087
|
||
|
||
Объявите класс Book для представления информации о книге. Объекты этого класса должны создаваться командами:
|
||
|
||
>>> book = Book()
|
||
>>> book = Book("название", "автор", 100, 1984) # 100 - число страниц, 1984 - год издания
|
||
|
||
В каждом объекте класса Book автоматически должны формироваться следующие локальные свойства:
|
||
|
||
title - заголовок книги (строка, по умолчанию пустая строка);
|
||
author - автор книги (строка, по умолчанию пустая строка);
|
||
pages - число страниц (целое число, по умолчанию 0);
|
||
year - год издания (целое число, по умолчанию 0).
|
||
|
||
Объявите в классе Book магический метод __setattr__ для проверки типов присваиваемых данных локальным свойствам title, author, pages и year. Если типы не соответствуют локальному атрибуту (например, title должна ссылаться на строку, а pages - на целое число), то генерировать исключение командой:
|
||
|
||
raise TypeError("Неверный тип присваиваемых данных.")
|
||
>>> book = Book(1)
|
||
Traceback (most recent call last):
|
||
...
|
||
TypeError: Неверный тип присваиваемых данных.
|
||
|
||
Создайте в программе объект book класса Book для книги:
|
||
|
||
автор: Сергей Балакирев
|
||
заголовок: Python ООП
|
||
pages: 123
|
||
year: 2022
|
||
|
||
>>> book = Book("Python ООП", "Сергей Балакирев", 123, 2022)
|
||
>>> str(book)
|
||
'Python ООП, Сергей Балакирев, 123, 2022'
|
||
"""
|
||
|
||
|
||
class Book:
|
||
title: str = ""
|
||
author: str = ""
|
||
pages: int = 0
|
||
year: int = 0
|
||
|
||
def __init__(self, *args, **kwargs):
|
||
for src in (zip(self.__annotations__, args), kwargs.items()):
|
||
for k, v in src:
|
||
setattr(self, k, v)
|
||
|
||
def __str__(self):
|
||
return f"{self.title}, {self.author}, {self.pages}, {self.year}"
|
||
|
||
def __setattr__(self, name: str, value):
|
||
if not isinstance(value, self.__annotations__.get(name, object)):
|
||
raise TypeError("Неверный тип присваиваемых данных.")
|
||
super().__setattr__(name, value)
|
||
|
||
|
||
def tests():
|
||
...
|
||
|
||
|
||
if __name__ == "__main__":
|
||
import doctest
|
||
|
||
doctest.testmod()
|
||
tests()
|