Почему я должен использовать классы в python?

Я очень любительский ученик Python, и недавно я начал изучать концепцию классов. Я понимаю концепцию классов (очень) грубо, но я не могу понять, почему я не могу просто написать некоторые функции вместо написания класса?

Например, (я изучаю Interactive python ) одно из заданий (которое я должен писать с помощью класса):

  1. Добавьте метод DistanceFromPoint, который работает подобно distanceFromOrigin за исключением того, что он принимает Point как параметр и вычисляет расстояние между этой точкой и «я».

  2. Добавьте метод reflect_x в Point который возвращает новую Point , которая является отражением точки относительно оси x. Например, Point(3, 5).reflect_x() равна (3, -5) .

Они написали код, используя следующие классы:

 import math class Point: """ Point class for representing and manipulating x,y coordinates. """ def __init__(self, initX, initY): """ Create a new point at the given coordinates. """ self.x = initX self.y = initY def getX(self): return self.x def getY(self): return self.y def distanceFromOrigin(self): return ((self.x ** 2) + (self.y ** 2)) ** 0.5 def distanceFromPoint(self, otherP): dx = (otherP.getX() - self.x) dy = (otherP.getY() - self.y) return math.sqrt(dy**2 + dx**2) p = Point(3, 3) q = Point(6, 7) print(p.distanceFromPoint(q)) 

Почему я должен использовать класс, когда могу писать их просто так:

 def distanceFromPoint(p,q): # they are tuples y = (p[0]-q[0])**(2)+(p[1]-q[1])**(2) return y**(1/2) def reflectx(p): return (p[0],-p[1]) p = (3,3) q = (6,7) 

4 Solutions collect form web for “Почему я должен использовать классы в python?”

Одним из больших преимуществ использования ООП является расширяемость .

Допустим, вы написали приложение, которое обрабатывает множество данных в виде точек. Теперь ваш клиент добавляет к спецификации, а также координату x и y каждой точки, ваше приложение должно знать, какой цвет имеет каждая точка.

Если бы вы написали свой код для хранения каждой точки в качестве кортежа, (x, y) , вы можете добавить цвет в качестве третьего значения: (x, y, colour) . Но теперь вам нужно пройти весь свой код, чтобы найти места, где он сломан, потому что вы изменили формат данных. Если бы вы использовали класс, вы могли бы просто определить новый класс, который наследует от Point и добавляет необходимые возможности:

 class ColouredPoint(Point): """ Class for points which are coloured, based on Point """ def __init__(self, initX, initY, initCol): Point.__init__(self, initX, initY) self.colour = initCol p = ColouredPoint(3, 3, "green") q = ColouredPoint(6, 7, "red") r = Point(8, 4) print(p.distanceFromPoint(q)) print(p.colour) print(p.distanceFromPoint(r)) 

Весь ваш код, который работал с классом Point , по-прежнему будет работать с новым классом, и вы можете это сделать, даже если вы не указали или не смогли изменить определение класса Point .

Вы можете объявить функцию вне класса. Но хранение их в классе – лучшая теория в программировании. ООП считается более читаемым и также многоразовым.

И в этом случае расстояние между двумя точками зависит от точек, поэтому логично иметь метод distanceFromPoint в этом классе.

Класс также позволяет вам быть уверенным, чем вы рассчитываете расстояние от очков, а не за кортежи, которые могут содержать плохие значения, например более двух координат.

Ваш пример точки плохой для обоснования использования классов.

Класс – отличный способ описать что-то, а не манипулировать данными. Таким образом, точка имеет только два бита информации, описывающих его (в любом случае в 2D-пространстве).

Подумайте о чем-то более абстрактном, например, файле фильма. У фильмов есть вся информация, связанная с ними: название, продолжительность, жанры, актеры, возрастный рейтинг, популярность, язык, награды … продолжается. Попробуйте написать функции, которые обрабатывают длинный список всей этой информации, и вы быстро увидите достоинства класса.

Математика – это, возможно, та область, где действительно не так много контекстуальной информации, есть только несколько переменных, и они определяют все. Реальные данные менее четко определены и, таким образом, выигрывают от расширяемости классов.

Функциональное и объектно-ориентированное программирование – это разные парадигмы.

В Python все является объектом, даже int s. Весь язык идет в сторону объектно-ориентированного программирования, поэтому вы должны предпочесть его, особенно если ваша программа будет расти.

  • Есть ли способ распечатать короткую версию docstring для всех членов объекта Python?
  • Как изменить значение одного атрибута, изменив значение другого? (зависимые атрибуты)
  • Python - Классы и основы ООП
  • Ориентация объектов на основе прототипа. Хороший, плохой, злой?
  • Различия между isinstance () и type () в python
  • Итерация над подклассами данного класса в данном модуле
  • Объяснение переменной «self» python для новичка
  • дизайн класса python (метод staticmethod vs)
  • Вывод pythons 'print' не вызывает метод .write ()?
  • Смутно о классах в Learn Python the Hard Way ex43?
  • Python: Должен ли я использовать класс или словарь?
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.