This commit is contained in:
Dmitry Belyaev 2024-04-10 11:14:07 +03:00
parent 402db810bc
commit 6afdca0f3a
1 changed files with 65 additions and 0 deletions

65
mod_oop/3.1_5_book.py Normal file
View File

@ -0,0 +1,65 @@
"""
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()