""" Урок 68. Атрибуты объекта и класса — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/68-attributes/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-68.py """ # ==================================================================== # Пример 1. Атрибут класса общий для всех объектов # ==================================================================== class Book: library_name: str = "Central Library" def __init__(self, title: str, author: str) -> None: self.title = title self.author = author book1 = Book("1984", "George Orwell") book2 = Book("Brave New World", "Aldous Huxley") print(Book.library_name) print(book1.library_name) print(book2.library_name) # ==================================================================== # Пример 2. Изменение атрибута класса через класс # ==================================================================== class Book: library_name: str = "Central Library" def __init__(self, title: str, author: str) -> None: self.title = title self.author = author book1 = Book("1984", "George Orwell") book2 = Book("Brave New World", "Aldous Huxley") Book.library_name = "City Library" print(book1.library_name) # City Library print(book2.library_name) # City Library # ==================================================================== # Пример 3. Присваивание через объект создаёт собственный атрибут # ==================================================================== class Book: library_name: str = "Central Library" def __init__(self, title: str, author: str) -> None: self.title = title self.author = author book1 = Book("1984", "George Orwell") book2 = Book("Brave New World", "Aldous Huxley") book1.library_name = "Private Shelf" print(book1.library_name) # Private Shelf print(book2.library_name) # Central Library print(Book.library_name) # Central Library print(book1.__dict__) print(book2.__dict__) # ==================================================================== # Пример 4. Поле объекта по умолчанию # ==================================================================== class Book: def __init__(self, title: str, author: str, language: str = "English") -> None: self.title = title self.author = author self.language = language book1 = Book("1984", "George Orwell") book2 = Book("Cien años de soledad", "Gabriel García Márquez", "Spanish") print(book1.language) # English print(book2.language) # Spanish # ==================================================================== # Пример 5. Классовый метод как счётчик объектов # ==================================================================== class Book: total_books: int = 0 def __init__(self, title: str, author: str) -> None: self.title = title self.author = author Book.total_books += 1 @classmethod def show_total(cls) -> None: print(f"Total books: {cls.total_books}") Book.show_total() # Total books: 0 book1 = Book("1984", "George Orwell") book2 = Book("Brave New World", "Aldous Huxley") Book.show_total() # Total books: 2 book1.show_total() # Total books: 2 # ==================================================================== # Пример 6. Альтернативный конструктор # ==================================================================== class Book: def __init__(self, title: str, author: str) -> None: self.title = title self.author = author @classmethod def from_string(cls, data: str) -> "Book": title, author = data.split(" - ") return cls(title, author) book = Book.from_string("1984 - George Orwell") print(book.title) print(book.author) # ==================================================================== # Пример 7. Статический метод для валидации # ==================================================================== class Book: def __init__(self, title: str) -> None: self.title = title @staticmethod def is_title_valid(title: str) -> bool: return isinstance(title, str) and len(title) > 0 print(Book.is_title_valid("1984")) # True print(Book.is_title_valid("")) # False print(Book.is_title_valid(123)) # False # ==================================================================== # Пример 8. __str__ и __repr__ # ==================================================================== class Book: def __init__(self, title: str, author: str) -> None: self.title = title self.author = author def __str__(self) -> str: return f"{self.title} by {self.author}" def __repr__(self) -> str: return f"Book(title={self.title!r}, author={self.author!r})" book = Book("1984", "George Orwell") print(book) # 1984 by George Orwell print(str(book)) # 1984 by George Orwell print(repr(book)) # Book(title='1984', author='George Orwell') books = [book] print(books) # [Book(title='1984', author='George Orwell')]