Классы и ООП являются ИМХО всегда хорошим выбором, используя их, вы сможете лучше организовать и повторно использовать свой код, вы можете создавать новые классы, которые наследуются от существующего класса, чтобы расширять его функциональность (наследование) или изменятьего поведение, если вам нужно (полиморфизм), а также инкапсуляция внутренних частей вашего кода, чтобы он стал более безопасным (хотя в Python нет реальной инкапсуляции).
В вашем конкретном случае, например, высоздание калькулятора, который использует технику для вычисления пересечения, если кто-то другой, использующий ваш класс, хочет изменить это поведение, он может переопределить функцию (это Полиморфизм в действии):
class PointCalculator:
def intersection(self, P1, P2, dist1, dist2):
# Your initial implementation
class FasterPointCalculator(PointCalculator):
def __init__(self):
super().__init__()
def intersection(self, P1, P2, dist1, dist2):
# New implementation
Или вы можетерасширять класс в будущем:
class BetterPointCalculator(PointCalculator):
def __init__(self):
super().__init__()
def distance(self, P1, P2):
# New function
Вам может потребоваться инициализировать ваш класс некоторыми необходимыми данными, и вы можете не захотеть, чтобы пользователи могли изменять его, вы можете указать инкапсуляцию, назвав свои переменные с помощьюподчеркивание:
class PointCalculator:
def __init__(self, p1, p2):
self._p1 = p1
self._p2 = p2
def do_something(self):
# Do something with your data
self._p1 + self._p2
Как вы, наверное, заметили, self - это pоценивается автоматически при вызове функции, она содержит ссылку на текущий объект (экземпляр класса), поэтому вы можете получить доступ ко всему объявленному в нем, например к переменным _p1 и _p2 в приведенном выше примере.
Вы также можетесоздайте методы класса (статические методы), и тогда у вас не будет доступа к self, вы должны сделать это для методов, которые выполняют общие вычисления, или для любой операции, которая не нуждается в конкретном экземпляре, ваш метод пересечения может быть хорошим кандидатом, например
class PointCalculator:
@staticmethod
def intersection(P1, P2, dist1, dist2):
# Return the result
Теперь вам не нужен экземпляр PointCalculator, вы можете просто вызвать PointCalculator.intersection(1, 2, 3, 4)
Еще одним преимуществом использования классов может быть оптимизация памяти, Python будет удалять объекты из памяти, когда онивыйдите из области видимости, поэтому, если у вас длинный сценарий с большим количеством данных, они не будут освобождены из памяти, пока сценарий не завершится.
Сказав это, для небольших служебных сценариев, которые выполняют очень специфические задачи,например, установить приложение, настроить какой-либо сервис,без какой-либо задачи администрирования ОС и т. д. простой сценарий полностью подходит, и это одна из причин популярности Python.