Когда использовать классы (ООП)?

1,00
р.
Я изучаю/программирую на Python уже как год, но до сих пор не могу понять когда использовать классы. Читая книги и просматривая видео уроки, я осознаю такие вещи как инкапсуляция или, что такое абстракция. Но, когда речь заходит о моментах когда именно надо использовать ООП, я встаю в ступор.

В моем мышлении, классы можно заменить на модули с набором тематических функций. Никаких
self
'ов перед переменными и в качестве первого аргумента методов, никаких объявлений класса перед использованием, импортируй и пользуйся.

Какие советы/материал для изучения Вы можете дать для понятия данной темы и изучения ООП в целом?

P.S. Я видел похожий вопрос, но он не ответил на мой.

Ответ
Это парадигма, которую вы можете использовать везде или не использовать вообще. У неё есть свои плюсы и свои минусы. Но какого-то магического порога, когда её использовать или когда её не использовать нету.
Из основных плюсов можно отметить, что программа разбивается на классы, которые отвечают только за свой участок кода. При этом абстракция скрывает внутренние детали, которые вам не нужно знать. Поэтому большие и сложные программы становится легче понимать и заниматься их отладкой. Вы точно будете знать, где и что находится, если не допустите ошибок.
Из минусов, это сложность проектирования, ведь перед написанием следует очень хорошо продумать вашу модель данных. Иногда это может занимать очень много времени и сил, особенно с непривычки.

Классы действительно можно заменить на модули и если я не ошибаюсь, то вы получите что-то вроде компонентно-ориентированного программирования. В общем есть множество способов проектировать программное обеспечение и оно не заканчивается только на ООП, хоть последний и на слуху у всех.

P.S. В общем, можете прямо сразу брать и использовать ООП везде, даже в самых маленьких программах. Правда для Python и маленьких программ, это просто лишняя трата сил на проектирование, как по мне. Но может будет очень полезно при работе с базами данных и ORM.