Pourquoi devrais-je utiliser les classes en python?

Je suis très amateur de l'apprenant de Python, et j'ai récemment commencé l'apprentissage de la notion de classes. Je peux comprendre la notion de classes (très) gros, mais je ne comprends pas pourquoi je ne peux pas tout simplement écrire quelques fonctions à la place de l'écriture d'une classe?

Par exemple, (je suis en train d'apprendre à partir de Interactive python) l'un de l'exercice donné (que je suis censé écrire à l'aide d'une classe) est :

  1. Ajouter un distanceFromPoint méthode qui fonctionne de manière similaire à distanceFromOrigin sauf qu'elle prend un Point comme paramètre et qui calcule la distance entre ce point et l'auto.

  2. Ajouter une méthode reflect_x à Point qui renvoie une nouvelle Point, celui qui est le symétrique du point sur l'axe des abscisses. Par exemple, Point(3, 5).reflect_x() est (3, -5).

Ils ont écrit le code à l'aide de classes comme ceci:

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))

Pourquoi devrais-je utiliser la classe quand je peux les écrire, tout simplement comme ceci:

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)
  • Au moins la getX et getY méthodes ne sont pas considérés comme pythonic code. Vous pouvez accéder à la x et y attributs directement.
  • En dehors de plus de réponses générales ci-dessous: vous n'avez pas vraiment besoin de la getX/getY. Python n'a pas de réel membres privés, donc à l'aide seulement de x/y est ok. Si vous avez besoin de les remplacer, les propriétés sont toujours disponibles.
  • Je suis nouveau sur le python. Je ne peux pas comprendre ce qui est pythonic code et pourquoi getX, getY ne sont pas pythonic codes ?
  • Vous n'avez pas besoin de perdre le sommeil plus de ce qui est ou n'est pas "Pythonic", mais j'espère que vous voyez que mypoint.x est plus simple et plus clair que mypoint.getX(). Il est difficile d'illustrer la puissance de la POO dans un exemple simple. Je n'ai jamais vraiment "tout" jusqu'à ce que j'ai eu un vrai problème à résoudre, qui je réalisai soudain était étonnamment simple si j'ai écrit une classe qui a hérité de quelqu'un d'autre auparavant classe définie.
  • Pouvez-vous s'il vous plaît mentionner l'un de ceux de l'exercice de la programmation orientée objet en python qui vous ont conduit à la "révélation"?
  • Comme je l'ai dit c'était un vrai problème, pas un exercice, - comme vous, je n'avais pas vu précédemment le point de la programmation orientée objet basé sur les exemples artificiels, que j'avais rencontré. Peut-être que vous pouvez penser à quelque chose que vous voulez créer, et utilisez ce processus en tant que véhicule d'apprendre certaines de ces techniques?
  • Bien qu'il semble que votre question est "Pourquoi OO', j'ai vraiment l'impression de la surutilisation des OO approche en python au moins. J'ai vu tellement de code faisant des choses simples, à l'aide OO pour pas (à moins évident) raisons (pas d'héritage tout utilisé, etc). L'ensemble du code pourrait être beaucoup plus simple sans avoir à écrire de classes, et beaucoup plus facilement testable avec l'approche par programmation fonctionnelle. Cela ne signifie pas que les classes sont une mauvaise chose, ils sont nécessaires pour résoudre la plupart des grandes et/ou des problèmes complexes, mais j'ai toujours trouvé leur surutilisation.

InformationsquelleAutor | 2016-04-15