protocol_2.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from typing import Protocol
  2. '''
  3. Абстрактные базовые классы
  4. - Абстракнтые классы нельзя использовать по отдельности, и их можно использовать
  5. только путем реализации дочернего класса. Поэтому ABC по своей сути принадлежат
  6. к своим подклассам как часть строгой иерархии классов.
  7. - Хорошо подходят для проверки в реальном времени при создании экземпляра
  8. дочернего класса. ABC выдаст ошибку при инициализации, если дочерний элемент
  9. не реализует все его абстрактные методы.
  10. Протоколы
  11. - Не используют иерархию.
  12. - Используются в определенном месте и сообщают нижестоящему коду, какой
  13. должна быть структура входного объекта. Протоколы принадлежат тому месту,
  14. где они используются.
  15. - Подходит для определения интерфейсов, особенно для сторонних библиотек,
  16. когда мы не хотим тесно связывать наш код с конкретной сторонней библиотекой.
  17. Где спользовать
  18. - Используйте ABC, если хотите повторно использовать код.
  19. - Используйте ABC, если вам требуется строгая иерархия классов в вашем
  20. приложении.
  21. - Используйте ABC, если вам понадобится несколько реализаций класса с
  22. несолькокими методами.
  23. - Используйте протоколы для аннотаций строгого типа.
  24. - Используйте протоколы для абстрактных интерфейсов для сторонних библиотек.
  25. '''
  26. class Animal(Protocol):
  27. def walk(self) -> None:
  28. ...
  29. def speak(self) -> None:
  30. ...
  31. class Dog:
  32. def walk(self) -> None:
  33. print('This is dog walking')
  34. def speak(self) -> None:
  35. print('Woof!')
  36. def make_animal_speak(animal: Animal) -> None:
  37. animal.speak()
  38. def test_1():
  39. dog = Dog()
  40. make_animal_speak(dog)
  41. def main():
  42. test_1()
  43. if __name__ == '__main__':
  44. main()