Зацикливается setter

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
Всем добрый день!
Подскажите, пожалуйста, почему у меня зацикливаются строчки с @pages.setter до self.pages = pages (24 - 29)? Вот никак не пойму((

Python:
class Book:
    """ Базовый класс книги. """

    def __init__(self, name: str, author: str):
        self._name = name
        self._author = author

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}"

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r})"


class PaperBook(Book):
    def __init__(self, name: str, author: str):
        super().__init__(name, author)

    @property
    def pages(self):
        return self.pages

    @pages.setter
    def pages(self, pages: int):
        if not isinstance(pages, int):
            raise TypeError("Количество страниц должно быть типа int")
        if pages <= 0:
            raise ValueError("Количество страниц должно быть положительным числом")
        self.pages = pages

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}. Объем {self.pages} страниц."

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r}, pages={self.pages})"


class AudioBook(Book):
    def __init__(self, name: str, author: str):
        super().__init__(name, author)

    @property
    def duration(self):
        return self.duration

    @duration.setter
    def duration(self, duration: float):
        if not isinstance(duration, float):
            raise TypeError("Продолжительность должна быть типа Float")
        if duration <= 0:
            raise ValueError("Продолжительность должна быть положительным числом")
        self.duration = duration

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}. Продолжительность {self.duration} часов."

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r}, duration={self.duration})"


book1 = PaperBook('A Byte of Python', 'Swaroop Chitlur')
book1.pages = 164

book2 = AudioBook('Начала Python', 'Петр Питонов')
book2.duration = 999.9

print(book1.__str__())
print(book1.__repr__())

print()

print(book2.__str__())
print(book2.__repr__())
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
Подскажите, пожалуйста, почему у меня зацикливаются строчки с @pages.setter до self.pages = pages (24 - 29)? Вот никак не пойму((
нужно в имени добавить нижнее подчеркивание, и в self.duration тоже

Python:
class Book:
    """ Базовый класс книги. """

    def __init__(self, name: str, author: str):
        self._name = name
        self._author = author

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}"

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r})"


class PaperBook(Book, object):
    def __init__(self, name: str, author: str):
        super().__init__(name, author)

    @property
    def pages(self):
        return self._pages

    @pages.setter
    def pages(self, pages: int):
        if not isinstance(pages, int):
            raise TypeError("Количество страниц должно быть типа int")
        if pages <= 0:
            raise ValueError("Количество страниц должно быть положительным числом")
        self._pages = pages

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}. Объем {self._pages} страниц."

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r}, pages={self._pages})"


class AudioBook(Book):
    def __init__(self, name: str, author: str):
        super().__init__(name, author)

    @property
    def duration(self):
        return self._duration

    @duration.setter
    def duration(self, duration: float):
        if not isinstance(duration, float):
            raise TypeError("Продолжительность должна быть типа Float")
        if duration <= 0:
            raise ValueError("Продолжительность должна быть положительным числом")
        self._duration = duration

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}. Продолжительность {self._duration} часов."

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r}, duration={self._duration})"


book1 = PaperBook('A Byte of Python', 'Swaroop Chitlur')
book1.pages = 164

book2 = AudioBook('Начала Python', 'Петр Питонов')
book2.duration = 999.9

print(book1.__str__())
print(book1.__repr__())

print()

print(book2.__str__())
print(book2.__repr__())
 

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
нужно в имени добавить нижнее подчеркивание, и в self.duration тоже

Python:
class Book:
    """ Базовый класс книги. """

    def __init__(self, name: str, author: str):
        self._name = name
        self._author = author

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}"

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r})"


class PaperBook(Book, object):
    def __init__(self, name: str, author: str):
        super().__init__(name, author)

    @property
    def pages(self):
        return self._pages

    @pages.setter
    def pages(self, pages: int):
        if not isinstance(pages, int):
            raise TypeError("Количество страниц должно быть типа int")
        if pages <= 0:
            raise ValueError("Количество страниц должно быть положительным числом")
        self._pages = pages

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}. Объем {self._pages} страниц."

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r}, pages={self._pages})"


class AudioBook(Book):
    def __init__(self, name: str, author: str):
        super().__init__(name, author)

    @property
    def duration(self):
        return self._duration

    @duration.setter
    def duration(self, duration: float):
        if not isinstance(duration, float):
            raise TypeError("Продолжительность должна быть типа Float")
        if duration <= 0:
            raise ValueError("Продолжительность должна быть положительным числом")
        self._duration = duration

    def __str__(self):
        return f"Книга {self._name}. Автор {self._author}. Продолжительность {self._duration} часов."

    def __repr__(self):
        return f"{self.__class__.__name__}(name={self._name!r}, author={self._author!r}, duration={self._duration})"


book1 = PaperBook('A Byte of Python', 'Swaroop Chitlur')
book1.pages = 164

book2 = AudioBook('Начала Python', 'Петр Питонов')
book2.duration = 999.9

print(book1.__str__())
print(book1.__repr__())

print()

print(book2.__str__())
print(book2.__repr__())
Спасибо! Но тут предполагалось, что условный пользователь этой программы не сможет изменять name и author (и потому они с подчеркиваниями), а duration и pages - они должны по идее быть... э-э... публичными атрибутами, а не защищёнными, наверное. То есть, это не очень существенно уже. но я хочу понять... они теперь тоже стали не публичными, а защищенными?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 581
457
83
сеттер и делается для изменения защищенной переменой, с публичными он не нужен
ну и в питоне понятия приватных, публичных или защищенных атрибутов класса немного иные, не как в с++ например
 
Последнее редактирование:
  • Мне нравится
Реакции: Наги

Наги

Пользователь
Пользователь
Окт 25, 2020
75
5
8
сеттер и делается для изменения защищенной переменой, с публичными он не нужен
ну и в питоне понятия приватных, публичных или защищенных атрибутов класса немного иные, не как в с++ например
Поняла, спасибо огромное!!
 

Форум IT Специалистов