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 :
-
Ajouter un
distanceFromPoint
méthode qui fonctionne de manière similaire àdistanceFromOrigin
sauf qu'elle prend unPoint
comme paramètre et qui calcule la distance entre ce point et l'auto. -
Ajouter une méthode
reflect_x
àPoint
qui renvoie une nouvellePoint
, 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
etgetY
méthodes ne sont pas considérés comme pythonic code. Vous pouvez accéder à lax
ety
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 quemypoint.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.
Vous devez vous connecter pour publier un commentaire.
L'un des grands avantages de l'utilisation de la programmation orientée objet est extensibilité.
Disons que vous avais écrit une application qui traite beaucoup de données sous la forme de points. Maintenant, votre client ajoute à la spécification ainsi que les coordonnées x et y de chaque point, votre application a besoin de connaître quelle est la couleur de chaque point est.
Si vous aviez écrit votre code pour stocker chaque point comme un n-uplet,
(x, y)
, vous pouvez ajouter de la couleur comme une troisième valeur:(x, y, colour)
. Mais maintenant, vous devez aller à travers l'ensemble de votre code pour trouver les endroits où il est brisé parce que vous avez modifié le format des données. Si vous aviez utilisé une classe, vous pouvez simplement définir une nouvelle classe qui hérite dePoint
et ajoute les fonctionnalités nécessaires:Tous vos codes qui ont travaillé avec le
Point
classe va continuer à travailler avec la nouvelle classe, et vous pouvez le faire même si vous n'écrivez pas, ou ne peut pas changer, la définition de laPoint
classe.reflectx
la fonction en question serait - il perdre le surplus de données. Vous pouvez venir avec une solution qui j'en suis sûr, mais j'espère vous voir le plus possible des modifications et des extensions à l'origine que vous pensez, plus il devient difficile de concevoir un type de données qui se comporte correctement. Lorsque vous arrivez à la complexité du monde réel les applications de la programmation orientée objet est beaucoup plus facile et plus robuste, et la ci-dessus est seulement une des raisons pour l'utilisation de la programmation orientée objet.Vous pouvez déclarer une fonction à l'extérieur de la classe.
Mais de les ranger dans la classe est une meilleure pratique en général dans la programmation. La programmation orientée objet est considéré comme pour être plus lisible et également réutilisables.
Et dans ce cas, la distance entre deux points dépend des points, il est donc logique que la distanceFromPoint méthode dans cette classe.
Classe également vous permettre d'être sûr que vous calculez la distance depuis Points et pas pour les n-uplets qui contient de mauvaises valeurs, à l'instar de plus de deux coordonnées.
Votre exemple d'un point est mauvais pour la justification de l'utilisation des classes.
Une classe est un excellent moyen de décrire ce que quelque chose est plutôt que de manipuler des données. Donc d'un point a seulement deux bits d'information décrivant (dans l'espace 2D de toute façon).
Penser à quelque chose de plus abstrait, comme un fichier vidéo. Les films ont toutes sortes d'informations qui leur sont associés: le titre, la durée, les genres, acteurs, évaluation de l'âge, de la popularité, de la langue, des prix... va sur. Essayez d'écrire des fonctions qui gèrent une longue liste de toutes ces informations et vous permettra de voir rapidement le bien-fondé d'une classe.
Les Maths, c'est peut-être le seul domaine où il n'y a vraiment pas beaucoup d'informations contextuelles, il y a seulement quelques variables, et ils définissent tout. Données du monde réel est moins clairement défini et ainsi les avantages de l'extensibilité des classes.
Fonctionnelle et orientée objet de programmation sont des paradigmes différents.
En Python, tout est objet, même
int
s. L'ensemble de la langue va vers la programmation orientée objet, qui est pourquoi vous devriez préférer aller pour lui, surtout si votre programme va croître.