py_stepik/mod_oop/3.1_5_book.py
2024-04-10 11:14:07 +03:00

66 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
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()