🐍 Π‘Π°ΠΌΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ Python для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…. Π§Π°ΡΡ‚ΡŒ 19: ΠžΡΠ½ΠΎΠ²Ρ‹ ООП – абстракция ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ

РасскаТСм, для Ρ‡Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΈ абстракция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ концСпциями ООП. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ – Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ 10 Π·Π°Π΄Π°Ρ‡, связанных с абстрактными ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹ΠΌΠΈ классами.

Напомним, Ρ‡Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ – ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹ ООП Π² Python: прСдыдущая Ρ‡Π°ΡΡ‚ΡŒ Π±Ρ‹Π»Π° посвящСна инкапсуляции ΠΈ наслСдованию.

Абстракция

Одна ΠΈΠ· основных Ρ†Π΅Π»Π΅ΠΉ использования абстракции Π² ООП – ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ гибкости ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Абстрактный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ интСрфСйсы ΠΈ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для выполнСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π­Ρ‚ΠΎ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‚ΡΡ измСнСнию ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с графичСскими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ абстрактный класс Shape (Ρ„ΠΈΠ³ΡƒΡ€Π°), ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с любой Ρ„ΠΈΠ³ΡƒΡ€ΠΎΠΉ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ классы для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ„ΠΈΠ³ΡƒΡ€ – ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ ΠΈ Ρ‚.Π΄., ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Shape. ΠŸΡ€ΠΈ этом ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для выполнСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, игнорируя Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ значСния Π² Π΄Π°Π½Π½ΠΎΠΌ контСкстС.

Абстрактный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ эффСктивно Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ряд слоТных Π·Π°Π΄Π°Ρ‡:

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ сущСствСнныС характСристики ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, игнорируя всС Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ.
  • ΠŸΡ€ΠΈΠ½ΡƒΠΆΠ΄Π°Π΅Ρ‚ подклассы ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΠ»ΠΈ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡƒΡ‚Π΅ΠΌ опрСдСлСния абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΠ»ΠΈ свойств. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, абстракция позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ интСрфСйсы для классов, Π½ΠΎ ΠΏΡ€ΠΈ этом Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ подкласс Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ свою Π²Π΅Ρ€ΡΠΈΡŽ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΈΠ»ΠΈ свойств.
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  • Π£ΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ со слоТными систСмами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ мноТСство Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΈ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹Π΅, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Π΅ прилоТСния.

АбстрактныС классы Π² Python

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с абстрактными классами Π² Python ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ abc. Он прСдоставляСт:

  • abc.ABC – Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс для создания абстрактных классов. Абстрактный класс содСрТит ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±Π΅Π· опрСдСлСния (пустых, Π±Π΅Π· ΠΊΠΎΠ΄Π°). Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² подклассах.
  • abc.abstractmethod – Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ являСтся абстрактным. Π­Ρ‚ΠΎΡ‚ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ примСняСтся ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ абстрактного класса. Класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт свойства ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ абстрактного класса, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ абстрактным.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ абстрактного класса Book:

from abc import ABC, abstractmethod

class Book(ABC):
    def __init__(self, title, author):
        self.title = title
        self.author = author

    @abstractmethod
    def get_summary(self):
        pass

class Fiction(Book):
    def get_summary(self):
        print(f'"{self.title}" - Ρ€ΠΎΠΌΠ°Π½ Π² стилС историчСский Ρ„ΠΈΠΊΡˆΠ½, Π°Π²Ρ‚ΠΎΡ€ - {self.author}')

class NonFiction(Book):
    def get_summary(self):
        print(f'"{self.title}" - ΠΊΠ½ΠΈΠ³Π° Π² стилС Π½ΠΎΠ½ Ρ„ΠΈΠΊΡˆΠ½, Π°Π²Ρ‚ΠΎΡ€ - {self.author}')

class Poetry(Book):
    pass

Класс Book ΠΈΠΌΠ΅Π΅Ρ‚ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ get_summary(). Π”Π²Π° подкласса Book (Fiction ΠΈ NonFiction) Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ get_summary(), Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ подкласс Poetry – Π½Π΅Ρ‚. Когда ΠΌΡ‹ создаСм экзСмпляры Fiction ΠΈ NonFiction ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ get_summary(), ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

fiction_book = Fiction("Π’Π΅Ρ€Ρ€ΠΎΡ€", "Дэн Биммонс")
nonfiction_book = NonFiction("Как ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ½ΠΈΠ³ΠΈ", "Π‘Ρ‚ΠΈΠ²Π΅Π½ Кинг")
fiction_book.get_summary()
nonfiction_book.get_summary()

Π’Ρ‹Π²ΠΎΠ΄:

"Π’Π΅Ρ€Ρ€ΠΎΡ€" - Ρ€ΠΎΠΌΠ°Π½ Π² стилС историчСский Ρ„ΠΈΠΊΡˆΠ½, Π°Π²Ρ‚ΠΎΡ€ - Дэн Биммонс
"Как ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ½ΠΈΠ³ΠΈ" - ΠΊΠ½ΠΈΠ³Π° Π² стилС Π½ΠΎΠ½ Ρ„ΠΈΠΊΡˆΠ½, Π°Π²Ρ‚ΠΎΡ€ - Π‘Ρ‚ΠΈΠ²Π΅Π½ Кинг

А Π²ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ² Poetry ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² этом подклассС ΠΌΠ΅Ρ‚ΠΎΠ΄ get_summary() Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½:

poetry_book = Poetry("БтихотворСния", "Борис ΠŸΠ°ΡΡ‚Π΅Ρ€Π½Π°ΠΊ")

Π’Ρ‹Π²ΠΎΠ΄:

TypeError: Can't instantiate abstract class Poetry with abstract methods get_summary

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сСмСйство родствСнных классов (Fiction ΠΈ NonFiction Π² нашСм случаС) ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс (ΠΌΠ΅Ρ‚ΠΎΠ΄ get_summary()), Π½ΠΎ рСализация этого интСрфСйса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΎΠΉ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ±Π΅Π΄ΠΈΠ»ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ любой подкласс Book Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ get_summary(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡƒΡŽ, Π±Π΅Π·ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ рассмотрим Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТный ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ продСмонстрируСт, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ†ΠΈΡŽ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ концСпциями ООП. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ абстрактный класс Recipe (Ρ€Π΅Ρ†Π΅ΠΏΡ‚), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ cook(). Π—Π°Ρ‚Π΅ΠΌ создадим Ρ‚Ρ€ΠΈ подкласса Entree, Dessert ΠΈ Appetizer (основноС блюдо, дСсСрт ΠΈ закуска). Entree ΠΈ Dessert ΠΈΠΌΠ΅ΡŽΡ‚ свои собствСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ cook(), Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Appetizer ΠΈ PartyMix. PartyMix (ΠΎΡ€Π΅ΡˆΠΊΠΈ, чипсы, ΠΊΡ€Π΅ΠΊΠ΅Ρ€Ρ‹) являСтся подклассом Appetizer ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ cook():

from abc import ABC, abstractmethod

class Recipe(ABC):
    @abstractmethod
    def cook(self):
        pass

class Entree(Recipe):
    def __init__(self, ingredients):
        self.ingredients = ingredients

    def cook(self):
        print(f"Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠ³Π½Π΅ смСсь ΠΈΠ½Π³Ρ€Π΅Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ² ({', '.join(self.ingredients)}) для основного блюда")

class Dessert(Recipe):
    def __init__(self, ingredients):
        self.ingredients = ingredients

    def cook(self):
        print(f"БмСшиваСм {', '.join(self.ingredients)} для дСсСрта")

class Appetizer(Recipe):
    pass

class PartyMix(Appetizer):
    def cook(self):
        print("Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ снСки - Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Π½Π° поднос ΠΎΡ€Π΅ΡˆΠΊΠΈ, чипсы ΠΈ ΠΊΡ€Π΅ΠΊΠ΅Ρ€Ρ‹")

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ наряду с абстракциСй ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° ΠΈ наслСдования.

НаслСдованиС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ подклассы Entree, Dessert ΠΈ PartyMix Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄ cook() ΠΎΡ‚ абстрактного Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса Recipe. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Ρƒ ΠΆΠ΅ сигнатуру (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹) ΠΌΠ΅Ρ‚ΠΎΠ΄Π° cook(), Ρ‡Ρ‚ΠΎ ΠΈ абстрактный ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π² классС Recipe.

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ проявляСтся Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ подкласс класса Recipe Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ cook() ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ. НапримСр, Entree Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ cook() для Π²Ρ‹Π²ΠΎΠ΄Π° инструкций ΠΏΠΎ ΠΏΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ΠΈΡŽ основного блюда Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠ³Π½Π΅, Π° Dessert Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ cook() для Π²Ρ‹Π²ΠΎΠ΄Π° инструкций ΠΏΠΎ смСшиванию ΠΈΠ½Π³Ρ€Π΅Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ² дСсСрта. Π­Ρ‚Π° Ρ€Π°Π·Π½ΠΈΡ†Π° Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ, Π½ΠΎ ΠΏΡ€ΠΈ этом Π²Π΅Π΄ΡƒΡ‚ сСбя ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ:

entree = Entree(["ΠΊΡƒΡ€ΠΈΡ†Π°", "рис", "ΠΎΠ²ΠΎΡ‰ΠΈ"])
dessert = Dessert(["ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½ΠΎΠ΅", "ΡˆΠΎΠΊΠΎΠ»Π°Π΄Π½Ρ‹Π΅ чипсы", "мараскиновыС вишни"])
partymix = PartyMix()
entree.cook() 
dessert.cook()
partymix.cook()

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π½Π° ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ ΠΎΠ³Π½Π΅ смСсь ΠΈΠ½Π³Ρ€Π΅Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ² (ΠΊΡƒΡ€ΠΈΡ†Π°, рис, ΠΎΠ²ΠΎΡ‰ΠΈ) для основного блюда
БмСшиваСм ΠΌΠΎΡ€ΠΎΠΆΠ΅Π½ΠΎΠ΅, ΡˆΠΎΠΊΠΎΠ»Π°Π΄Π½Ρ‹Π΅ чипсы, мараскиновыС вишни для дСсСрта
Π“ΠΎΡ‚ΠΎΠ²ΠΈΠΌ снСки - Π²Ρ‹ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌ Π½Π° поднос ΠΎΡ€Π΅ΡˆΠΊΠΈ, чипсы ΠΈ ΠΊΡ€Π΅ΠΊΠ΅Ρ€Ρ‹

Π’Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° cook() для подкласса Appetizer ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠΉ ошибкС:

appetizer = Appetizer()
appetizer.cook()

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

TypeError: Can't instantiate abstract class Appetizer with abstract methods cook
🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ Python
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ PythonΒ»
🐍🧩 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ позволяСт ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… классов Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· наслСдованиС, интСрфСйсы ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько вСсомых прСимущСств:

  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² зависимости ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для использования.
  • Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° – ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с нСсколькими Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².
  • ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ интСрфСйсы ΠΈ абстракции для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ².
  • ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Π΅Ρ‚ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ – ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±Π΅Π· нСобходимости ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½Π΅ Π½Π°Ρ€ΡƒΡˆΠ°Ρ Π΅Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ тСсно связан с абстракциСй:

  • Абстракция позволяСт ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌ. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ понятным ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΌ.
  • ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ПО.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, абстракция позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, Π° ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

Рассмотрим ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ класса Confectionary (кондитСрскиС издСлия):

class Confectionary:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def describe(self):
        print(f"{self.name} ΠΏΠΎ Ρ†Π΅Π½Π΅ {self.price} Ρ€ΡƒΠ±/ΠΊΠ³")

class Cake(Confectionary):
    def describe(self):
        print(f"{self.name} Ρ‚ΠΎΡ€Ρ‚ стоит {self.price} Ρ€ΡƒΠ±/ΠΊΠ³")

class Candy(Confectionary):
    def describe(self):
        print(f"{self.name} ΠΊΠΎΠ½Ρ„Π΅Ρ‚Ρ‹ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ {self.price} Ρ€ΡƒΠ±/ΠΊΠ³")

class Cookie(Confectionary):
    pass

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ опрСдСляСм Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Confectionary, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ name ΠΈ price, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ describe(). Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ опрСдСляСм Ρ‚Ρ€ΠΈ подкласса класса Confectionary: Cake, Candy ΠΈ Cookie. Cake ΠΈ Candy ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ describe() своими собствСнными рСализациями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Ρ‚ΠΈΠΏ кондитСрского издСлия (Ρ‚ΠΎΡ€Ρ‚ ΠΈ ΠΊΠΎΠ½Ρ„Π΅Ρ‚Ρ‹ соотвСтствСнно), Π° Cookie наслСдуСт Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ describe() ΠΎΡ‚ Confectionary.

Если ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляры этих классов ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ describe(), ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ подклассС:

cake = Cake("ΠŸΡ€Π°ΠΆΡΠΊΠΈΠΉ", 1200)
candy = Candy("Π¨ΠΎΠΊΠΎΠ»Π°Π΄Π½Ρ‹Π΅ Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Ρ‹", 560)
cookie = Cookie("ОвсяноС ΠΏΠ΅Ρ‡Π΅Π½ΡŒΠ΅ с ΠΌΠΈΠ½Π΄Π°Π»Π΅ΠΌ", 250)

cake.describe()  
candy.describe()  
cookie.describe()

Π’Ρ‹Π²ΠΎΠ΄:

ΠŸΡ€Π°ΠΆΡΠΊΠΈΠΉ Ρ‚ΠΎΡ€Ρ‚ стоит 1200 Ρ€ΡƒΠ±/ΠΊΠ³
Π¨ΠΎΠΊΠΎΠ»Π°Π΄Π½Ρ‹Π΅ Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Ρ‹ ΠΊΠΎΠ½Ρ„Π΅Ρ‚Ρ‹ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ 560 Ρ€ΡƒΠ±/ΠΊΠ³
ОвсяноС ΠΏΠ΅Ρ‡Π΅Π½ΡŒΠ΅ с ΠΌΠΈΠ½Π΄Π°Π»Π΅ΠΌ ΠΏΠΎ Ρ†Π΅Π½Π΅ 250 Ρ€ΡƒΠ±/ΠΊΠ³

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ класса Beverage (Π½Π°ΠΏΠΈΡ‚ΠΎΠΊ) взаимодСйствиС ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ° с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ концСпциями ООП. Beverage – Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит:

  • Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ названия, объСма ΠΈ Ρ†Π΅Π½Ρ‹;
  • ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для получСния ΠΈ установки этих Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²;
  • ΠΌΠ΅Ρ‚ΠΎΠ΄ для Π²Ρ‹Π²ΠΎΠ΄Π° описания Π½Π°ΠΏΠΈΡ‚ΠΊΠ°.

Soda (Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠ°) – Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ класс Beverage, Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ flavor (вкус) ΠΈ собствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ describe(), Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ flavor. DietSoda – Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ класс Soda, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт всС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Soda, Π½ΠΎ пСрСопрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ describe(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠ° являСтся диСтичСской:

class Beverage:
    def __init__(self, name, size, price):
        self._name = name
        self._size = size
        self._price = price

    def get_name(self):
        return self._name

    def get_size(self):
        return self._size

    def get_price(self):
        return self._price

    def set_price(self, price):
        self._price = price

    def describe(self):
        return f'{self._size} Π» Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΈ "{self._name}" стоит {self._price} Ρ€ΡƒΠ±.'

class Soda(Beverage):
    def __init__(self, name, size, price, flavor):
        super().__init__(name, size, price)
        self._flavor = flavor

    def get_flavor(self):
        return self._flavor

    def describe(self):
        return f'{self._size} Π» Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΈ "{self._name}" со вкусом "{self._flavor}" стоит {self._price} Ρ€ΡƒΠ±.'

class DietSoda(Soda):
    def __init__(self, name, size, price, flavor):
        super().__init__(name, size, price, flavor)

    def describe(self):
        return f'{self._size} Π» диСтичСской Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΈ "{self._name}" со вкусом "{self._flavor}" стоит {self._price} Ρ€ΡƒΠ±.'

regular_soda = Soda('Sprite', 0.33, 45, 'Π»ΠΈΠΌΠΎΠ½')
print(regular_soda.describe()) 
diet_soda = DietSoda('Mirinda', 0.33, 50, 'ΠΌΠ°Π½Π΄Π°Ρ€ΠΈΠ½')
print(diet_soda.describe()) 
regular_soda = Soda('Π‘ΡƒΡ€Π°Ρ‚ΠΈΠ½ΠΎ', 1.5, 65, 'дюшСс')
print(regular_soda.describe())

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ дСмонстрируСт:

  • Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Ρ‹ символами подчСркивания ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ getter ΠΈ setter.
  • НаслСдованиС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Soda ΠΈ DietSoda Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΡ‚ Beverage.
  • ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс ΠΈΠΌΠ΅Π΅Ρ‚ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° describe(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ класса.

Π’Ρ‹Π²ΠΎΠ΄:

0.33 Π» Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΈ "Sprite" со вкусом "Π»ΠΈΠΌΠΎΠ½" стоит 45 Ρ€ΡƒΠ±.
0.33 Π» диСтичСской Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΈ "Mirinda" со вкусом "ΠΌΠ°Π½Π΄Π°Ρ€ΠΈΠ½" стоит 50 Ρ€ΡƒΠ±.
1.5 Π» Π³Π°Π·ΠΈΡ€ΠΎΠ²ΠΊΠΈ "Π‘ΡƒΡ€Π°Ρ‚ΠΈΠ½ΠΎ" со вкусом "дюшСс" стоит 65 Ρ€ΡƒΠ±.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°

Π—Π°Π΄Π°Π½ΠΈΠ΅ 1

Π’ Π΄Π°Π»Π΅ΠΊΠΎΠΉ-Π΄Π°Π»Π΅ΠΊΠΎΠΉ Π³Π°Π»Π°ΠΊΡ‚ΠΈΠΊΠ΅ ЀСдСрация Π²Π΅Π΄Π΅Ρ‚ ΠΎΠΆΠ΅ΡΡ‚ΠΎΡ‡Π΅Π½Π½ΡƒΡŽ Π²ΠΎΠΉΠ½Ρƒ с ΠΊΠ»ΠΈΠ½Π³ΠΎΠ½Π°ΠΌΠΈ. Π—Π²Π΅Π·Π΄ΠΎΠ»Π΅Ρ‚Ρ‹ Π€Π΅Π΄Π΅Ρ€Π°Ρ†ΠΈΠΈ оснащСны ΠΌΠΎΡ‰Π½Ρ‹ΠΌΠΈ Ρ„Π°Π·Π΅Ρ€Π°ΠΌΠΈ, Π° клингонскиС ΠΊΠΎΡ€Π°Π±Π»ΠΈ – смСртоносными Ρ„ΠΎΡ‚ΠΎΠ½Π½Ρ‹ΠΌΠΈ Ρ‚ΠΎΡ€ΠΏΠ΅Π΄Π°ΠΌΠΈ. ОбС стороны Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Π°Ρ€ΠΏ-Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ для пСрСмСщСния со свСрхсвСтовой ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ, ΠΈ ΠΎΠ±ΠΎΡ€ΡƒΠ΄ΠΎΠ²Π°Π»ΠΈ свои ΠΊΠΎΡ€Π°Π±Π»ΠΈ систСмами самоуничтоТСния Π½Π° случай Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎΠΉ ситуации.

Для ΠΈΠ³Ρ€Ρ‹, посвящСнной этой Π²ΠΎΠΉΠ½Π΅, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ абстрактный класс Starship с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ warp_speed(), fire_weapon() ΠΈ self_destruct(). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° подкласса FederationStarship ΠΈ KlingonWarship, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Starship ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ свои собствСнныС вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² warp_speed(), fire_weapon() ΠΈ self_destruct().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

enterprise = FederationStarship()
bird_of_prey = KlingonWarship()

enterprise.warp_speed()
bird_of_prey.warp_speed()

enterprise.fire_weapon()
bird_of_prey.fire_weapon()

enterprise.self_destruct()
bird_of_prey.self_destruct()

Π’Ρ‹Π²ΠΎΠ΄:

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΏ-Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ!
Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ маскировочноС устройство!
Π’Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΠΎΡ‚ΠΎΠ½Π½Ρ‹Π΅ Ρ‚ΠΎΡ€ΠΏΠ΅Π΄Ρ‹!
Π‘Ρ‚Ρ€Π΅Π»ΡΡ‚ΡŒ ΠΈΠ· Ρ„Π°Π·Π΅Ρ€ΠΎΠ²!
Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ систСму самоуничтоТСния...
Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» самоуничтоТСния...

РСшСниС:

from abc import ABC, abstractmethod

class Starship(ABC):
    @abstractmethod
    def warp_speed(self):
        pass

    @abstractmethod
    def fire_weapon(self):
        pass

    @abstractmethod
    def self_destruct(self):
        pass

class FederationStarship(Starship):
    def warp_speed(self):
        print("Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Π°Ρ€ΠΏ-Π΄Π²ΠΈΠ³Π°Ρ‚Π΅Π»ΠΈ!")

    def fire_weapon(self):
        print("Π’Ρ‹ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ„ΠΎΡ‚ΠΎΠ½Π½Ρ‹Π΅ Ρ‚ΠΎΡ€ΠΏΠ΅Π΄Ρ‹!")

    def self_destruct(self):
        print("Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ систСму самоуничтоТСния...")

class KlingonWarship(Starship):
    def warp_speed(self):
        print("Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ маскировочноС устройство!")

    def fire_weapon(self):
        print("Π‘Ρ‚Ρ€Π΅Π»ΡΡ‚ΡŒ ΠΈΠ· Ρ„Π°Π·Π΅Ρ€ΠΎΠ²!")

    def self_destruct(self):
        print("Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» самоуничтоТСния...")

Π—Π°Π΄Π°Π½ΠΈΠ΅ 2

Для ПО рСсторана Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС Ρ„Ρ€ΡƒΠΊΡ‚ΠΎΠ² ΠΈ ΠΎΠ²ΠΎΡ‰Π΅ΠΉ Π½Π° ΠΊΡƒΡ…Π½Π΅. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ абстрактный класс Ingredient с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ get_name() ΠΈ get_quantity(). Π—Π°Ρ‚Π΅ΠΌ создайтС Π΄Π²Π° подкласса Vegetable ΠΈ Fruit, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ Ingredient ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ свои собствСнныС вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² get_name() ΠΈ get_quantity().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

carrot = Vegetable("ΠœΠΎΡ€ΠΊΠΎΠ²ΡŒ", 5)
apple = Fruit("Π―Π±Π»ΠΎΠΊΠΈ", 10)

print(carrot.get_name())
print(carrot.get_quantity())

print(apple.get_name())
print(apple.get_quantity())

Π’Ρ‹Π²ΠΎΠ΄:

ΠœΠΎΡ€ΠΊΠΎΠ²ΡŒ
5 ΠΊΠ³
Π―Π±Π»ΠΎΠΊΠΈ
10 ΠΊΠ³

РСшСниС:

from abc import ABC, abstractmethod

class Ingredient(ABC):
    @abstractmethod
    def get_name(self):
        pass

    @abstractmethod
    def get_quantity(self):
        pass

class Vegetable(Ingredient):
    def __init__(self, name, quantity):
        self.name = name
        self.quantity = quantity

    def get_name(self):
        return self.name

    def get_quantity(self):
        return f'{self.quantity} ΠΊΠ³'

class Fruit(Ingredient):
    def __init__(self, name, quantity):
        self.name = name
        self.quantity = quantity

    def get_name(self):
        return self.name

    def get_quantity(self):
        return f'{self.quantity} ΠΊΠ³'

Π—Π°Π΄Π°Π½ΠΈΠ΅ 3

Для Π²ΠΎΠ΅Π½Π½ΠΎΠΉ стратСгии Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ абстрактный класс Soldier. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ солдат Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΌΠ΅Ρ‚ΡŒ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ, Π·Π°Ρ‰ΠΈΡ‰Π°Ρ‚ΡŒΡΡ ΠΈ Π°Ρ‚Π°ΠΊΠΎΠ²Π°Ρ‚ΡŒ, поэтому Soldier ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈ абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: move(), attack() ΠΈ defend(). Π”Π²Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… класса, Infantry (ΠΏΠ΅Ρ…ΠΎΡ‚Π°) ΠΈ Cavalry (кавалСрия), Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π’ ΠΈΠ³Ρ€Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ класс Army, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ солдат Π² Π°Ρ€ΠΌΠΈΡŽ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π°Ρ‚Π°ΠΊΠΈ ΠΈ Π·Π°Ρ‰ΠΈΡ‚Ρ‹.

Π§Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ экзСмпляры класса Soldier, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ validatesoldier, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ являСтся экзСмпляром класса Soldier, Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ TypeError. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ move(), attack() ΠΈ defend() классов Infantry ΠΈ Cavalry.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

army = Army()
army.add_soldier(Infantry())
army.add_soldier(Cavalry())
army.add_soldier(Infantry())
army.add_soldier(Cavalry())

army.attack()
army.defend()

Π’Ρ‹Π²ΠΎΠ΄:

ΠŸΠ΅Ρ…ΠΎΡ‚Π° пСрСдвигаСтся Π² пСшСм порядкС
ΠŸΠ΅Ρ…ΠΎΡ‚Π° участвуСт Π² Π±Π»ΠΈΠΆΠ½Π΅ΠΌ бою
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ пСрСдвигаСтся Π²Π΅Ρ€Ρ…ΠΎΠΌ
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π°Ρ‚Π°ΠΊΡƒ
ΠŸΠ΅Ρ…ΠΎΡ‚Π° пСрСдвигаСтся Π² пСшСм порядкС
ΠŸΠ΅Ρ…ΠΎΡ‚Π° участвуСт Π² Π±Π»ΠΈΠΆΠ½Π΅ΠΌ бою
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ пСрСдвигаСтся Π²Π΅Ρ€Ρ…ΠΎΠΌ
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π°Ρ‚Π°ΠΊΡƒ
ΠŸΠ΅Ρ…ΠΎΡ‚Π° пСрСдвигаСтся Π² пСшСм порядкС
ΠŸΠ΅Ρ…ΠΎΡ‚Π° Π΄Π΅Ρ€ΠΆΠΈΡ‚ строй
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ пСрСдвигаСтся Π²Π΅Ρ€Ρ…ΠΎΠΌ
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ Ρ„Π»Π°Π½Π³ΠΈ
ΠŸΠ΅Ρ…ΠΎΡ‚Π° пСрСдвигаСтся Π² пСшСм порядкС
ΠŸΠ΅Ρ…ΠΎΡ‚Π° Π΄Π΅Ρ€ΠΆΠΈΡ‚ строй
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ пСрСдвигаСтся Π²Π΅Ρ€Ρ…ΠΎΠΌ
ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ Ρ„Π»Π°Π½Π³ΠΈ

РСшСниС:

from abc import ABC, abstractmethod

def validate_soldier(func):
    def wrapper(self):
        if not isinstance(self, Soldier):
            raise TypeError("ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ являСтся экзСмпляром Soldier")
        return func(self)
    return wrapper

class Soldier(ABC):
    @abstractmethod
    def move(self):
        pass

    @abstractmethod
    def attack(self):
        pass

    @abstractmethod
    def defend(self):
        pass

class Infantry(Soldier):
    @validate_soldier
    def move(self):
        print("ΠŸΠ΅Ρ…ΠΎΡ‚Π° пСрСдвигаСтся Π² пСшСм порядкС")

    @validate_soldier
    def attack(self):
        print("ΠŸΠ΅Ρ…ΠΎΡ‚Π° участвуСт Π² Π±Π»ΠΈΠΆΠ½Π΅ΠΌ бою")

    @validate_soldier
    def defend(self):
        print("ΠŸΠ΅Ρ…ΠΎΡ‚Π° Π΄Π΅Ρ€ΠΆΠΈΡ‚ строй")

class Cavalry(Soldier):
    @validate_soldier
    def move(self):
        print("ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ пСрСдвигаСтся Π²Π΅Ρ€Ρ…ΠΎΠΌ")

    @validate_soldier
    def attack(self):
        print("ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π°Ρ‚Π°ΠΊΡƒ")

    @validate_soldier
    def defend(self):
        print("ΠšΠ°Π²Π°Π»Π΅Ρ€ΠΈΡ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ Ρ„Π»Π°Π½Π³ΠΈ")

class Army:
    def __init__(self):
        self.soldiers = []

    def add_soldier(self, soldier):
        self.soldiers.append(soldier)

    def attack(self):
        for soldier in self.soldiers:
            soldier.move()
            soldier.attack()

    def defend(self):
        for soldier in self.soldiers:
            soldier.move()
            soldier.defend()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 4

ΠŸΠ°Π»Π΅ΠΎΠ½Ρ‚ΠΎΠ»ΠΎΠ³Π°ΠΌ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ Π² Π·Π°ΠΏΠΎΠ²Π΅Π΄Π½ΠΈΠΊΠ΅ для Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€ΠΎΠ², понадобилось ПО для отслСТивания мноТСства травоядных ΠΈ плотоядных ΠΏΠΎΠ΄ΠΎΠΏΠ΅Ρ‡Π½Ρ‹Ρ…. Π”Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€Ρƒ – имя, Π²ΠΈΠ΄, рост, вСс ΠΈ Ρ€Π°Ρ†ΠΈΠΎΠ½ питания.

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ абстрактный класс Dinosaur с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ get_personal_name(), get_breed(), get_height(), get_weight() ΠΈ get_diet(). Π—Π°Ρ‚Π΅ΠΌ создайтС Π΄Π²Π° подкласса Carnivore (плотоядный) ΠΈ Herbivore (травоядный), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Dinosaur ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ свои собствСнныС вСрсии get_personal_name(), get_breed(), get_height(), get_weight() ΠΈ get_diet(). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, создайтС класс DinosaurPark, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит список Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€ΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ list_dinosaurs(), list_carnivores() ΠΈ list_herbivores() для Π²Ρ‹Π²ΠΎΠ΄Π° списков a) всСх Π΄ΠΈΠ½ΠΎΠ·Π°Π²Ρ€ΠΎΠ², b) плотоядных ΠΈ c) травоядных особСй.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

t_rex = Carnivore('Π’ΠΈΡ€Π°Π½Π½ΠΎΠ·Π°Π²Ρ€', 'РСкс', 4800, 560)
velociraptor = Carnivore('Π’Π΅Π»ΠΎΡ†ΠΈΡ€Π°ΠΏΡ‚ΠΎΡ€', 'Зубастик', 30, 70)
stegosaurus = Herbivore('Π‘Ρ‚Π΅Π³ΠΎΠ·Π°Π²Ρ€', 'Π‘Ρ‚Π΅Π³Π³Π°', 7100, 420)
triceratops = Herbivore('ВрицСратопс', 'Врипси', 8000, 290)

park = DinosaurPark()

park.add_dinosaur(t_rex)
park.add_dinosaur(velociraptor)
park.add_dinosaur(stegosaurus)
park.add_dinosaur(triceratops)


for dinosaur in park.list_dinosaurs():
    print(f'Имя: {dinosaur[0]}\n'
    f'Π’ΠΈΠ΄: {dinosaur[1]}\n'
    f'ВСс: {dinosaur[2]} ΠΊΠ³\n'
    f'Рост: {dinosaur[3]} см\n'
    f'Π Π°Ρ†ΠΈΠΎΠ½: {dinosaur[4]}\n')

Π’Ρ‹Π²ΠΎΠ΄:

Имя: РСкс
Π’ΠΈΠ΄: Π’ΠΈΡ€Π°Π½Π½ΠΎΠ·Π°Π²Ρ€
ВСс: 4800 ΠΊΠ³
Рост: 560 см
Π Π°Ρ†ΠΈΠΎΠ½: ΠŸΠ»ΠΎΡ‚ΠΎΡΠ΄Π½Ρ‹ΠΉ

Имя: Зубастик
Π’ΠΈΠ΄: Π’Π΅Π»ΠΎΡ†ΠΈΡ€Π°ΠΏΡ‚ΠΎΡ€
ВСс: 30 ΠΊΠ³
Рост: 70 см
Π Π°Ρ†ΠΈΠΎΠ½: ΠŸΠ»ΠΎΡ‚ΠΎΡΠ΄Π½Ρ‹ΠΉ

Имя: Π‘Ρ‚Π΅Π³Π³Π°
Π’ΠΈΠ΄: Π‘Ρ‚Π΅Π³ΠΎΠ·Π°Π²Ρ€
ВСс: 7100 ΠΊΠ³
Рост: 420 см
Π Π°Ρ†ΠΈΠΎΠ½: Вравоядный

Имя: Врипси
Π’ΠΈΠ΄: ВрицСратопс
ВСс: 8000 ΠΊΠ³
Рост: 290 см
Π Π°Ρ†ΠΈΠΎΠ½: Вравоядный

РСшСниС:

from abc import ABC, abstractmethod

class Dinosaur(ABC):
    @abstractmethod
    def get_personal_name(self):
        pass

    @abstractmethod
    def get_breed(self):
        pass

    @abstractmethod
    def get_height(self):
        pass

    @abstractmethod
    def get_weight(self):
        pass

    @abstractmethod
    def get_diet(self):
        pass

class Carnivore(Dinosaur):
    def __init__(self, breed, personal_name, height, weight):
        self.breed = breed
        self.personal_name = personal_name
        self.height = height
        self.weight = weight

    def get_personal_name(self):
        return self.personal_name

    def get_breed(self):
        return self.breed

    def get_height(self):
        return self.height

    def get_weight(self):
        return self.weight

    def get_diet(self):
        return 'ΠŸΠ»ΠΎΡ‚ΠΎΡΠ΄Π½Ρ‹ΠΉ'

class Herbivore(Dinosaur):
    def __init__(self, breed, personal_name, height, weight):
        self.breed = breed
        self.personal_name = personal_name
        self.height = height
        self.weight = weight

    def get_personal_name(self):
        return self.personal_name

    def get_breed(self):
        return self.breed

    def get_height(self):
        return self.height

    def get_weight(self):
        return self.weight

    def get_diet(self):
        return 'Вравоядный'

class DinosaurPark:
    def __init__(self):
        self.dinosaurs = []

    def add_dinosaur(self, dinosaur):
        self.dinosaurs.append(dinosaur)

    
    def list_dinosaurs(self):
        return [(dinosaur.get_personal_name(), dinosaur.get_breed(), dinosaur.get_height(), dinosaur.get_weight(), dinosaur.get_diet()) for dinosaur in self.dinosaurs]

    
    def list_carnivores(self):
        return [(dinosaur.get_personal_name(), dinosaur.get_breed(), dinosaur.get_height(), dinosaur.get_weight()) for dinosaur in self.dinosaurs if isinstance(dinosaur, Carnivore)]

    
    def list_herbivores(self):
        return [(dinosaur.get_personal_name(), dinosaur.get_breed(), dinosaur.get_height(), dinosaur.get_weight()) for dinosaur in self.dinosaurs if isinstance(dinosaur, Herbivore)]

Π—Π°Π΄Π°Π½ΠΈΠ΅ 5

Для ΡƒΡ‡Π΅Ρ‚Π° ΠΌΡƒΠ·Ρ‹ΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… инструмСнтов Π² оркСстрС Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ абстрактный класс Instrument с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ get_name(), get_type(), get_sound() ΠΈ play(). Π”Π²Π° подкласса StringedInstrument (струнныС) ΠΈ PercussionInstrument (ΡƒΠ΄Π°Ρ€Π½Ρ‹Π΅) Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Instrument ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ свои собствСнныС вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² get_name(), get_type(), get_sound() ΠΈ play(). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс Orchestra: ΠΎΠ½ добавляСт Π½ΠΎΠ²Ρ‹Π΅ инструмСнты ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ list_instruments(), list_stringed_instruments(), list_percussion_instruments(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выводят списки a) всСх инструмСнтов, b) ΡƒΠ΄Π°Ρ€Π½Ρ‹Ρ…, c) струнных.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

chello = StringedInstrument("Π²ΠΈΠΎΠ»ΠΎΠ½Ρ‡Π΅Π»ΡŒ", "струнный инструмСнт", "Strum")
maracas = PercussionInstrument("маракасы", "ΡƒΠ΄Π°Ρ€Π½Ρ‹ΠΉ инструмСнт", "Maracas")
violin = StringedInstrument("скрипка", "струнный инструмСнт", "Virtuso")
drums = PercussionInstrument("Π±Π°Ρ€Π°Π±Π°Π½", "ΡƒΠ΄Π°Ρ€Π½Ρ‹ΠΉ инструмСнт", "Beat")

orchestra = Orchestra()
orchestra.add_instrument(chello)
orchestra.add_instrument(maracas)
orchestra.add_instrument(violin)
orchestra.add_instrument(drums)

print("Π’ оркСстрe Π΅ΡΡ‚ΡŒ инструмСнты:", ', '.join(orchestra.list_instruments()))  
print("Π‘Ρ‚Ρ€ΡƒΠ½Π½Ρ‹Π΅ инструмСнты:", ', '.join(orchestra.list_stringed_instruments())) 
print("Π£Π΄Π°Ρ€Π½Ρ‹Π΅ инструмСнты:", ', '.join(orchestra.list_percussion_instruments()))  

print(chello.play())    
print(drums.play())

Π’Ρ‹Π²ΠΎΠ΄:

Π’ оркСстрe Π΅ΡΡ‚ΡŒ инструмСнты: Π²ΠΈΠΎΠ»ΠΎΠ½Ρ‡Π΅Π»ΡŒ, маракасы, скрипка, Π±Π°Ρ€Π°Π±Π°Π½
Π‘Ρ‚Ρ€ΡƒΠ½Π½Ρ‹Π΅ инструмСнты: Π²ΠΈΠΎΠ»ΠΎΠ½Ρ‡Π΅Π»ΡŒ, скрипка
Π£Π΄Π°Ρ€Π½Ρ‹Π΅ инструмСнты: маракасы, Π±Π°Ρ€Π°Π±Π°Π½
Π—Π²ΡƒΡ‡ΠΈΡ‚ струнный инструмСнт Π²ΠΈΠΎΠ»ΠΎΠ½Ρ‡Π΅Π»ΡŒ
Π—Π²ΡƒΡ‡ΠΈΡ‚ ΡƒΠ΄Π°Ρ€Π½Ρ‹ΠΉ инструмСнт Π±Π°Ρ€Π°Π±Π°Π½

РСшСниС:

from abc import ABC, abstractmethod

def print_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result
    return wrapper

class Instrument(ABC):
    @abstractmethod
    def get_name(self):
        pass

    @abstractmethod
    def get_type(self):
        pass

    @abstractmethod
    def get_sound(self):
        pass

    @abstractmethod
    def play(self):
        pass

class StringedInstrument(Instrument):
    def __init__(self, name, type, sound):
        self.name = name
        self.type = type
        self.sound = sound

    def get_name(self):
        return self.name

    def get_type(self):
        return self.type

    def get_sound(self):
        return self.sound


    def play(self):
        return f"Π—Π²ΡƒΡ‡ΠΈΡ‚ {self.type} {self.name}"

class PercussionInstrument(Instrument):
    def __init__(self, name, type, sound):
        self.name = name
        self.type = type
        self.sound = sound

    def get_name(self):
        return self.name

    def get_type(self):
        return self.type

    def get_sound(self):
        return self.sound

    def play(self):
        return f"Π—Π²ΡƒΡ‡ΠΈΡ‚ {self.type} {self.name}"

class Orchestra:
    def __init__(self):
        self.instruments = []

    def add_instrument(self, instrument):
        self.instruments.append(instrument)

    @print_decorator
    def list_instruments(self):
        return [instrument.get_name() for instrument in self.instruments]

    @print_decorator
    def list_stringed_instruments(self):
        return [instrument.get_name() for instrument in self.instruments if isinstance(instrument, StringedInstrument)]

    @print_decorator
    def list_percussion_instruments(self):
        return [instrument.get_name() for instrument in self.instruments if isinstance(instrument, PercussionInstrument)]

Π—Π°Π΄Π°Π½ΠΈΠ΅ 6

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ класс FilmCatalogue (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Ρ„ΠΈΠ»ΡŒΠΌΠΎΠ²), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ»ΡŒΠΌΠΎΡ‚Π΅ΠΊΠΈ. FilmCatalogue Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΈΠ½ΠΎΠΊΠ°Ρ€Ρ‚ΠΈΠ½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΠΌΡ‹ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ ΠΆΠ°Π½Ρ€Ρƒ. Для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ классы для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΆΠ°Π½Ρ€ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Horror, Action, Romance), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ класс Movie ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ play() для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΠΆΠ°Π½Ρ€Ρƒ относится Ρ„ΠΈΠ»ΡŒΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

my_catalogue = FilmCatalogue()

my_catalogue.add_movie(Drama("ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†", "ЀрСнсис Π€. Коппола"))
my_catalogue.add_movie(Comedy("НочныС ΠΈΠ³Ρ€Ρ‹", "Π”ΠΆΠΎΠ½ Ѐрэнсис Π”Π΅ΠΉΠ»ΠΈ, Π”ΠΆΠΎΠ½Π°Ρ‚Π°Π½ М. Π“ΠΎΠ»Π΄ΡˆΡ‚Π΅ΠΉΠ½"))
my_catalogue.add_movie(Horror("Π”Ρ€Π°ΠΊΡƒΠ»Π° Брэма Π‘Ρ‚ΠΎΠΊΠ΅Ρ€Π°", "ЀрСнсис Π€. Коппола"))
my_catalogue.add_movie(Action("ΠšΡ€ΡƒΡˆΠ΅Π½ΠΈΠ΅", "Π–Π°Π½-Ѐрансуа РишС"))
my_catalogue.add_movie(Romance("ЧСстная ΠΊΡƒΡ€Ρ‚ΠΈΠ·Π°Π½ΠΊΠ°", "ΠœΠ°Ρ€ΡˆΠ°Π»Π» Π₯Срсковиц"))

my_catalogue.play_all_movies()

print(f"\nНайдСны Ρ„ΠΈΠ»ΡŒΠΌΡ‹ уТасов:")
for movie in my_catalogue.search_movies_by_genre(Horror):
    print(movie.title)

print(f"\nЗапускаСм Ρ„ΠΈΠ»ΡŒΠΌ ΠΈΠ· ΠΆΠ°Π½Ρ€Π° 'ΠœΠ΅Π»ΠΎΠ΄Ρ€Π°ΠΌΡ‹':")
my_catalogue.play_movies_by_genre(Romance)

Π’Ρ‹Π²ΠΎΠ΄:

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΄Ρ€Π°ΠΌΡƒ 'ΠšΡ€Π΅ΡΡ‚Π½Ρ‹ΠΉ ΠΎΡ‚Π΅Ρ†' Ρ€Π΅ΠΆ. ЀрСнсис Π€. Коппола.
Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ комСдию 'НочныС ΠΈΠ³Ρ€Ρ‹' Ρ€Π΅ΠΆ. Π”ΠΆΠΎΠ½ Ѐрэнсис Π”Π΅ΠΉΠ»ΠΈ, Π”ΠΆΠΎΠ½Π°Ρ‚Π°Π½ М. Π“ΠΎΠ»Π΄ΡˆΡ‚Π΅ΠΉΠ½.
Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΠΌ уТасов 'Π”Ρ€Π°ΠΊΡƒΠ»Π° Брэма Π‘Ρ‚ΠΎΠΊΠ΅Ρ€Π°' Ρ€Π΅ΠΆ. ЀрСнсис Π€. Коппола.
Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΎΠ΅Π²ΠΈΠΊ 'ΠšΡ€ΡƒΡˆΠ΅Π½ΠΈΠ΅' Ρ€Π΅ΠΆ. Π–Π°Π½-Ѐрансуа РишС.
Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΌΠ΅Π»ΠΎΠ΄Ρ€Π°ΠΌΡƒ 'ЧСстная ΠΊΡƒΡ€Ρ‚ΠΈΠ·Π°Π½ΠΊΠ°' Ρ€Π΅ΠΆ. ΠœΠ°Ρ€ΡˆΠ°Π»Π» Π₯Срсковиц.

НайдСны Ρ„ΠΈΠ»ΡŒΠΌΡ‹ уТасов:
Π”Ρ€Π°ΠΊΡƒΠ»Π° Брэма Π‘Ρ‚ΠΎΠΊΠ΅Ρ€Π°

ЗапускаСм Ρ„ΠΈΠ»ΡŒΠΌ ΠΈΠ· ΠΆΠ°Π½Ρ€Π° 'ΠœΠ΅Π»ΠΎΠ΄Ρ€Π°ΠΌΡ‹':
Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΌΠ΅Π»ΠΎΠ΄Ρ€Π°ΠΌΡƒ 'ЧСстная ΠΊΡƒΡ€Ρ‚ΠΈΠ·Π°Π½ΠΊΠ°' Ρ€Π΅ΠΆ. ΠœΠ°Ρ€ΡˆΠ°Π»Π» Π₯Срсковиц.

РСшСниС:

class Movie:
    def __init__(self, title, director):
        self.title = title
        self.director = director

    def play(self):
        print(f"БобираСмся ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΈΠ»ΡŒΠΌ '{self.title}' Ρ€Π΅ΠΆ. {self.director}.")


class Comedy(Movie):
    def play(self):
        print(f"Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ комСдию '{self.title}' Ρ€Π΅ΠΆ. {self.director}.")


class Drama(Movie):
    def play(self):
        print(f"Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π΄Ρ€Π°ΠΌΡƒ '{self.title}' Ρ€Π΅ΠΆ. {self.director}.")


class Horror(Movie):
    def play(self):
        print(f"Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ„ΠΈΠ»ΡŒΠΌ уТасов '{self.title}' Ρ€Π΅ΠΆ. {self.director}.")


class Action(Movie):
    def play(self):
        print(f"Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΎΠ΅Π²ΠΈΠΊ '{self.title}' Ρ€Π΅ΠΆ. {self.director}.")


class Romance(Movie):
    def play(self):
        print(f"Π’ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΌΠ΅Π»ΠΎΠ΄Ρ€Π°ΠΌΡƒ '{self.title}' Ρ€Π΅ΠΆ. {self.director}.")


class FilmCatalogue:
    def __init__(self):
        self.movies = []

    def add_movie(self, movie):
        self.movies.append(movie)

    def play_all_movies(self):
        for movie in self.movies:
            movie.play()

    def search_movies_by_genre(self, genre):
        return [movie for movie in self.movies if isinstance(movie, genre)]

    def play_movies_by_genre(self, genre):
        movies = self.search_movies_by_genre(genre)
        for movie in movies:
            movie.play()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 7

Для CRM винодСльни Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΡƒΡ‡Π΅Ρ‚ красных, Π±Π΅Π»Ρ‹Ρ… ΠΈ Ρ€ΠΎΠ·ΠΎΠ²Ρ‹Ρ… Π²ΠΈΠ½, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ своС Π½Π°Π·Π²Π°Π½ΠΈΠ΅, сорт Π²ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄Π°, Π³ΠΎΠ΄ ΠΈ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρƒ ΠΏΠΎΠ΄Π°Ρ‡ΠΈ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Wine с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ name, grape ΠΈ year. Π—Π°Ρ‚Π΅ΠΌ создайтС Ρ‚Ρ€ΠΈ подкласса RedWine, WhiteWine ΠΈ RoseWine, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΡ‚ Wine ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ свои собствСнныС вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π° serve(). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, создайтС класс Winery, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Π΄Π΅Ρ‚ список Π²ΠΈΠ½ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ serve_wines(), Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ serve() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ½Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

winery = Winery()
winery.add_wine(RedWine("Cabernet Sauvignon", "ΠšΠ°Π±Π΅Ρ€Π½Π΅ Бовиньон", 2015))
winery.add_wine(WhiteWine("Chardonnay", "Π¨Π°Ρ€Π΄ΠΎΠ½Π΅", 2018))
winery.add_wine(RoseWine("Grenache", "Π“Ρ€Π΅Π½Π°Ρˆ", 2020))
winery.serve_wines()

Π’Ρ‹Π²ΠΎΠ΄:

ΠšΡ€Π°ΡΠ½ΠΎΠ΅ Π²ΠΈΠ½ΠΎ 'Cabernet Sauvignon', сдСланноС ΠΈΠ· Π²ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄Π° сорта ΠšΠ°Π±Π΅Ρ€Π½Π΅ Бовиньон Π² 2015 Π³ΠΎΠ΄Ρƒ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ½Π°Ρ‚Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹.
Π‘Π΅Π»ΠΎΠ΅ Π²ΠΈΠ½ΠΎ 'Chardonnay', сдСланноС ΠΈΠ· Π²ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄Π° сорта Π¨Π°Ρ€Π΄ΠΎΠ½Π΅ Π² 2018 Π³ΠΎΠ΄Ρƒ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΡ…Π»Π°ΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ.
Π ΠΎΠ·ΠΎΠ²ΠΎΠ΅ Π²ΠΈΠ½ΠΎ 'Grenache', сдСланноС ΠΈΠ· Π²ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄Π° сорта Π“Ρ€Π΅Π½Π°Ρˆ Π² 2020 Π³ΠΎΠ΄Ρƒ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ слСгка ΠΎΡ…Π»Π°ΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ.

РСшСниС:

class Wine:
    def __init__(self, name, grape, year):
        self.name = name
        self.grape = grape
        self.year = year

class RedWine(Wine):
    def serve(self):
        print(f"ΠšΡ€Π°ΡΠ½ΠΎΠ΅ Π²ΠΈΠ½ΠΎ '{self.name}', сдСланноС ΠΈΠ· Π²ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄Π° сорта {self.grape} Π² {self.year} Π³ΠΎΠ΄Ρƒ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ½Π°Ρ‚Π½ΠΎΠΉ Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹.")

class WhiteWine(Wine):
    def serve(self):
        print(f"Π‘Π΅Π»ΠΎΠ΅ Π²ΠΈΠ½ΠΎ '{self.name}', сдСланноС ΠΈΠ· Π²ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄Π° сорта {self.grape} Π² {self.year} Π³ΠΎΠ΄Ρƒ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΡ…Π»Π°ΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ.")

class RoseWine(Wine):
    def serve(self):
        print(f"Π ΠΎΠ·ΠΎΠ²ΠΎΠ΅ Π²ΠΈΠ½ΠΎ '{self.name}', сдСланноС ΠΈΠ· Π²ΠΈΠ½ΠΎΠ³Ρ€Π°Π΄Π° сорта {self.grape} Π² {self.year} Π³ΠΎΠ΄Ρƒ, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ слСгка ΠΎΡ…Π»Π°ΠΆΠ΄Π΅Π½Π½Ρ‹ΠΌ.")

class Winery:
    def __init__(self):
        self.wines = []

    def add_wine(self, wine):
        self.wines.append(wine)

    def serve_wines(self):
        for wine in self.wines:
            wine.serve()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 8

Для ПО аэропорта Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ пассаТирскиС ΠΈ Π³Ρ€ΡƒΠ·ΠΎΠ²Ρ‹Π΅ самолСты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ модСлью, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ, Π²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ ΠΈ Π³Ρ€ΡƒΠ·ΠΎΠΏΠΎΠ΄ΡŠΠ΅ΠΌΠ½ΠΎΡΡ‚ΡŒΡŽ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Aircraft (Π²ΠΎΠ·Π΄ΡƒΡˆΠ½ΠΎΠ΅ судно) с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ model, manufacturer ΠΈ capacity. Π—Π°Ρ‚Π΅ΠΌ создайтС Π΄Π²Π° подкласса PassengerAircraft ΠΈ CargoAircraft, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΡ‚ Aircraft ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ свои собствСнныС вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π° fly(). Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ создайтС класс Airport, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит список самолСтов ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ takeoff(), Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ fly() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ самолСта.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

airport = Airport()
airport.add_aircraft(PassengerAircraft("Boeing 747", "Π‘ΠΎΠΈΠ½Π³", 416))
airport.add_aircraft(CargoAircraft("Airbus A330", "Эйрбас", 70))
airport.add_aircraft(PassengerAircraft("Boeing 777", "Π‘ΠΎΠΈΠ½Π³", 396))
airport.takeoff()

Π’Ρ‹Π²ΠΎΠ΄:

ΠŸΠ°ΡΡΠ°ΠΆΠΈΡ€ΡΠΊΠΈΠΉ самолСт 'Boeing 747' Π²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ 416 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Π‘ΠΎΠΈΠ½Π³, поднимаСтся Π² Π²ΠΎΠ·Π΄ΡƒΡ… с пассаТирами Π½Π° Π±ΠΎΡ€Ρ‚Ρƒ.
Π“Ρ€ΡƒΠ·ΠΎΠ²ΠΎΠΉ самолСт 'Airbus A330' с Π³Ρ€ΡƒΠ·ΠΎΠΏΠΎΠ΄ΡŠΠ΅ΠΌΠ½ΠΎΡΡ‚ΡŒΡŽ 70 Ρ‚, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Эйрбас, поднимаСтся Π² Π²ΠΎΠ·Π΄ΡƒΡ… с Π³Ρ€ΡƒΠ·ΠΎΠΌ Π½Π° Π±ΠΎΡ€Ρ‚Ρƒ.
ΠŸΠ°ΡΡΠ°ΠΆΠΈΡ€ΡΠΊΠΈΠΉ самолСт 'Boeing 777' Π²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ 396 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ Π‘ΠΎΠΈΠ½Π³, поднимаСтся Π² Π²ΠΎΠ·Π΄ΡƒΡ… с пассаТирами Π½Π° Π±ΠΎΡ€Ρ‚Ρƒ.

РСшСниС:

class Aircraft:
    def __init__(self, model, manufacturer, capacity):
        self.model = model
        self.manufacturer = manufacturer
        self.capacity = capacity

class PassengerAircraft(Aircraft):
    def fly(self):
        print(f"ΠŸΠ°ΡΡΠ°ΠΆΠΈΡ€ΡΠΊΠΈΠΉ самолСт '{self.model}' Π²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ {self.capacity} Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ {self.manufacturer}, поднимаСтся Π² Π²ΠΎΠ·Π΄ΡƒΡ… с пассаТирами Π½Π° Π±ΠΎΡ€Ρ‚Ρƒ.")

class CargoAircraft(Aircraft):
    def fly(self):
        print(f"Π“Ρ€ΡƒΠ·ΠΎΠ²ΠΎΠΉ самолСт '{self.model}' с Π³Ρ€ΡƒΠ·ΠΎΠΏΠΎΠ΄ΡŠΠ΅ΠΌΠ½ΠΎΡΡ‚ΡŒΡŽ {self.capacity} Ρ‚, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠ΅ΠΉ {self.manufacturer}, поднимаСтся Π² Π²ΠΎΠ·Π΄ΡƒΡ… с Π³Ρ€ΡƒΠ·ΠΎΠΌ Π½Π° Π±ΠΎΡ€Ρ‚Ρƒ.")

class Airport:
    def __init__(self):
        self.aircrafts = []

    def add_aircraft(self, aircraft):
        self.aircrafts.append(aircraft)

    def takeoff(self):
        for aircraft in self.aircrafts:
            aircraft.fly()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 9

НСобходимо Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎ тСстировании ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΠΈ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… отличаСтся модСлью, процСссором, ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Computer с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ model, processor ΠΈ memory. Π—Π°Ρ‚Π΅ΠΌ создайтС Π΄Π²Π° подкласса Desktop ΠΈ Laptop, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Computer ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ свои собствСнныС вСрсии ΠΌΠ΅Ρ‚ΠΎΠ΄Π° run(). Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, создайтС класс ComputerStore, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит список ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ run_tests(), Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ run() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹ для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

store = ComputerStore()
store.add_computer(Desktop("HP Legion", "Intel Core i9-10900K", "64 Π“Π±"))
store.add_computer(Laptop("Dell Xtra", "Intel Core i5 13600K", "32 Π“Π±"))
store.add_computer(Desktop("Lenovo SuperPad", "AMD Ryzen 7 2700X", "16 Π“Π±"))
store.run_tests()

Π’Ρ‹Π²ΠΎΠ΄:

НачинаСм тСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ...
ЗапускаСм Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ 'HP Legion' с процСссором Intel Core i9-10900K ΠΈ 64 Π“Π± RAM.
ВСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.
НачинаСм тСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ...
ЗапускаСм Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ 'Dell Xtra' с процСссором Intel Core i5 13600K ΠΈ 32 Π“Π± RAM.
ВСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.
НачинаСм тСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ...
ЗапускаСм Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ 'Lenovo SuperPad' с процСссором AMD Ryzen 7 2700X ΠΈ 16 Π“Π± RAM.
ВСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.

РСшСниС:

def performance_test(func):
    def wrapper(*args, **kwargs):
        print("НачинаСм тСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ...")
        result = func(*args, **kwargs)
        print("ВСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½.")
        return result
    return wrapper

class Computer:
    def __init__(self, model, processor, memory):
        self.model = model
        self.processor = processor
        self.memory = memory

    @performance_test
    def run(self):
        pass

class Desktop(Computer):
    @performance_test
    def run(self):
        print(f"ЗапускаСм Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ '{self.model}' с процСссором {self.processor} ΠΈ {self.memory} RAM.")

class Laptop(Computer):
    @performance_test
    def run(self):
        print(f"ЗапускаСм Π½ΠΎΡƒΡ‚Π±ΡƒΠΊ '{self.model}' с процСссором {self.processor} ΠΈ {self.memory} RAM.")

class ComputerStore:
    def __init__(self):
        self.computers = []

    def add_computer(self, computer):
        self.computers.append(computer)

    def run_tests(self):
        for computer in self.computers:
            computer.run()

Π—Π°Π΄Π°Π½ΠΈΠ΅ 10

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс Cryptocurrency, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹:

  • name – Π½Π°Π·Π²Π°Π½ΠΈΠ΅;
  • symbol – символ-Ρ‚ΠΈΠΊΠ΅Ρ€;
  • minable – Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Ρ‹Ρ‡ΠΈ ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³ΠΎΠΌ;
  • rate_to_usd – Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ курс ΠΊ Π΄ΠΎΠ»Π»Π°Ρ€Ρƒ;
  • anonymous – Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.

Π—Π°Ρ‚Π΅ΠΌ создайтС Ρ‚Ρ€ΠΈ подкласса Nano, Iota ΠΈ Stellar, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса Cryptocurrency, ΠΈ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ свойствами, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠΌΠΈ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ вознаграТдСния Π·Π° ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³:

  • Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ block_lattice Ρƒ Nano;
  • tangle Ρƒ Iota.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ:

  1. Π”Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ minable_required, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΌΠ°ΠΉΠ½ΠΈΡ‚ΡŒ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Ρƒ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° mining_reward(), ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС, Ссли Π΅Π΅ ΠΌΠ°ΠΉΠ½ΠΈΡ‚ΡŒ нСльзя.
  2. Π€ΡƒΠ½ΠΊΡ†ΠΈΡŽ print_info, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ экзСмпляр ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Ρ‹ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΌΠΎΠ½Π΅Ρ‚Π΅, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, символ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Ρ‹Ρ‡ΠΈ, курс ΠΊ Π΄ΠΎΠ»Π»Π°Ρ€Ρƒ БША, Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π±Π»ΠΎΠΊ-Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

cryptocurrencies = [Nano(block_lattice=True, rate_to_usd=6, anonymous=False),
                    Iota(tangle=True, rate_to_usd=0.4, anonymous=False),
                    Stellar(distributed=False, rate_to_usd=0.15, anonymous=True)]

for crypto in cryptocurrencies:
    print_info(crypto)
    if crypto.minable:
        print(f"Награда Π·Π° ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³: {crypto.mining_reward()} {crypto.symbol}\n")

Π’Ρ‹Π²ΠΎΠ΄:

Nano (NANO): Π΄ΠΎΠ±Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³ΠΎΠΌ, курс ΠΊ USD: 6, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π±Π»ΠΎΠΊ-Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠ°
Награда Π·Π° ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³: 0.02 NANO

Iota (IOTA): Π΄ΠΎΠ±Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³ΠΎΠΌ, курс ΠΊ USD: 0.4, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
Награда Π·Π° ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³: 0.001 IOTA

Stellar (XLM): Π½Π΅ майнится, курс ΠΊ USD: 0.15, Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

РСшСниС:

class Cryptocurrency:
    def __init__(self, name, symbol, minable=True, rate_to_usd=1, anonymous=False):
        self.name = name
        self.symbol = symbol
        self.minable = minable
        self.rate_to_usd = rate_to_usd
        self.anonymous = anonymous

    def __str__(self):
        return f"{self.name} ({self.symbol})"

    def mining_reward(self):
        return None

def minable_required(func):
    def wrapper(crypto):
        if not crypto.minable:
            print("Π­Ρ‚Ρƒ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Ρƒ Π½Π΅ майнят")
            return None
        return func(crypto)
    return wrapper

class Nano(Cryptocurrency):
    def __init__(self, block_lattice=False, rate_to_usd=5, anonymous=True):
        super().__init__("Nano", "NANO", True, rate_to_usd, anonymous)
        self.block_lattice = block_lattice

    @minable_required
    def mining_reward(self):
        return 0.02 if self.block_lattice else 0.01

class Iota(Cryptocurrency):
    def __init__(self, tangle=False, rate_to_usd=0.3, anonymous=False):
        super().__init__("Iota", "IOTA", True, rate_to_usd, anonymous)
        self.tangle = tangle

    @minable_required
    def mining_reward(self):
        return 0.001 if self.tangle else 0.002

class Stellar(Cryptocurrency):
    def __init__(self, distributed=False, rate_to_usd=0.1, anonymous=True):
        super().__init__("Stellar", "XLM", False, rate_to_usd, anonymous)
        self.distributed = distributed

    def mining_reward(self):
        print("Stellar is not minable")
        return None

def print_info(crypto):
    minable_str = 'Π΄ΠΎΠ±Ρ‹Π²Π°ΡŽΡ‚ ΠΌΠ°ΠΉΠ½ΠΈΠ½Π³ΠΎΠΌ' if crypto.minable else 'Π½Π΅ майнится'
    anonymity_str = 'Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ' if crypto.anonymous else 'Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ'
    block_lattice_str = 'Π±Π»ΠΎΠΊ-Ρ€Π΅ΡˆΠ΅Ρ‚ΠΊΠ°' if hasattr(crypto, 'block_lattice') and crypto.block_lattice else ''
    
    if block_lattice_str:
        print(f"{crypto}: {minable_str}, курс ΠΊ USD: {crypto.rate_to_usd}, {anonymity_str}, {block_lattice_str}")
    else:
        print(f"{crypto}: {minable_str}, курс ΠΊ USD: {crypto.rate_to_usd}, {anonymity_str}")

ПодвСдСм ΠΈΡ‚ΠΎΠ³ΠΈ

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ нСсколькими Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ прСимущСствами, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…:

  • ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ – ООП позволяСт Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ слоТныС Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ ΠΈ простыС ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅.
  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΡ – ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ написанный ΠΊΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ наслСдования ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌΠ°.
  • Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ – ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… частСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ бСзопасным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ части вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для использования ΠΈΠ·Π²Π½Π΅.
  • Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ – ООП позволяСт Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅. МоТно Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ свойства ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… классов.
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° сопровоТдСния ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄ Π½Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ структуру ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, использованиС ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ классов ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ понятным.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ основы Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с графичСским интСрфСйсом.

***

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ самоучитСля

  1. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ, сфСры примСнСния, установка, ΠΎΠ½Π»Π°ΠΉΠ½ IDE
  2. ВсС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для изучСния Python с нуля – ΠΊΠ½ΠΈΠ³ΠΈ, сайты, ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈ курсы
  3. Π’ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ
  4. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками
  5. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списками ΠΈ списковыми Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ
  6. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со словарями ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ словарСй
  7. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ
  8. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со мноТСствами
  9. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ†ΠΈΠΊΠ»Π° for
  10. Условный Ρ†ΠΈΠΊΠ» while
  11. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ
  12. АнонимныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  13. РСкурсивныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
  14. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка, замыкания ΠΈ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Ρ‹
  15. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой
  16. РСгулярныС выраТСния
  17. ΠžΡΠ½ΠΎΠ²Ρ‹ скрапинга ΠΈ парсинга
  18. ΠžΡΠ½ΠΎΠ²Ρ‹ ООП: инкапсуляция ΠΈ наслСдованиС
  19. ΠžΡΠ½ΠΎΠ²Ρ‹ ООП: абстракция ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ
  20. ГрафичСский интСрфСйс Π½Π° Tkinter
  21. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ³Ρ€ Π½Π° Pygame
  22. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SQLite
  23. ΠžΡΠ½ΠΎΠ²Ρ‹ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π° Flask
  24. ΠžΡΠ½ΠΎΠ²Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с NumPy
  25. ΠžΡΠ½ΠΎΠ²Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ… с Pandas

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...