| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | from typing import Protocol'''Абстрактные базовые классы- Абстракнтые классы нельзя использовать по отдельности, и их можно использоватьтолько путем реализации дочернего класса. Поэтому ABC по своей сути принадлежатк своим подклассам как часть строгой иерархии классов.- Хорошо подходят для проверки в реальном времени при создании экземпляра дочернего класса. ABC выдаст ошибку при инициализации, если дочерний элементне реализует все его абстрактные методы.Протоколы- Не используют иерархию.- Используются в определенном месте и сообщают нижестоящему коду, какойдолжна быть структура входного объекта. Протоколы принадлежат тому месту,где они используются.- Подходит для определения интерфейсов, особенно для сторонних библиотек, когда мы не хотим тесно связывать наш код с конкретной сторонней библиотекой.Где спользовать- Используйте ABC, если хотите повторно использовать код.- Используйте ABC, если вам требуется строгая иерархия классов в вашем приложении.- Используйте ABC, если вам понадобится несколько реализаций класса с несолькокими методами.- Используйте протоколы для аннотаций строгого типа.- Используйте протоколы для абстрактных интерфейсов для сторонних библиотек.'''class Animal(Protocol):    def walk(self) -> None:        ...    def speak(self) -> None:        ...class Dog:    def walk(self) -> None:        print('This is dog walking')    def speak(self) -> None:        print('Woof!')def make_animal_speak(animal: Animal) -> None:    animal.speak()def test_1():    dog = Dog()    make_animal_speak(dog)def main():    test_1()if __name__ == '__main__':    main()
 |