Sono uno studente molto dilettante di Python e recentemente ho iniziato a imparare il concetto di classi. Riesco a capire il concetto di classi (molto) in modo approssimativo, ma non riesco a capire perché non possa semplicemente scrivere alcune funzioni invece di scrivere una classe?Perché dovrei usare le classi in python?
Per esempio, (sto imparando da Interactive python) uno dei esercizio dato (che dovrei scrivere utilizzando una classe) è:
aggiungere un metodo
distanceFromPoint
che funziona in modo simile adistanceFromOrigin
eccezione del fatto che prende unPoint
come parametro e calcola la distanza tra quel punto e il sé.Aggiungere un metodo
reflect_x
aPoint
che restituisce un nuovoPoint
, uno che è il riflesso del punto sull'asse x. Ad esempio,Point(3, 5).reflect_x()
è(3, -5)
.
Hanno scritto il codice utilizzando le classi in questo modo:
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))
Perché dovrei usare classe quando li posso scrivere semplicemente in questo modo:
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)
Almeno i metodi 'getX' e' getY' non sono considerati _pythonic code_. È possibile accedere direttamente agli attributi 'x' e' y'. – Matthias
Oltre alle risposte più generali qui sotto: non hai davvero bisogno del getX/getY. Python non ha membri privati reali, quindi usare solo x/y è ok. Se hai bisogno di sovrascriverli, le proprietà sono sempre disponibili. – viraptor
@Matthias: Sono nuovo di Python. Non riesco a capire cos'è il codice pythonic e perché getX, getY non sono codici pitonici? –