Python.
La programmazione a oggetti

L'overloading

Python non supporta il cosiddetto "overloading" dei metodi o delle funzioni. Supponiamo che io voglia creare una classe per gestire i vettori: la chiamerà Vettore.

I vettori in 3 dimensioni possono essere definiti usando coordinate cartesiane, oppure sferiche oppure ancora cilindriche e così via. Verrebbe quindi naturale definire vari costruttori, uno per ogni tipo di coordinate. VettoreCartesiane(self,x,y,z), VettoreSferiche(self,r,theta,phi), ecc...

Python non permette di definire più costruttori per la stessa classe. Né usando nomi diversi, infatti in Python il costruttore deve chiamarsi __init__, né usando due versioni con un numero differente di parametri, il vero e proprio overloading (che nel nostro caso è comunque inutile dato che servono sempre tre parametri).

Quindi in python all'interno del singolo costruttore devono essere considerate tutte le casistiche. Nel caso di esempio, la classe Vettore, questo significa creare un costruttore del tipo __init__(self, t, a, b, c) dove t è una lettera che rappresenta il tipo di coordinate e a, b e c sono tre numeri reali che definiscono le tre coordinate del vettore nel sistema scelto.

Se la situazione non è così semplice si può usare *args e **kwargs. Vedi questa pagina.

Un altro modo è quello di creare un costruttore "vuoto" (o quasi) e poi obbligare l'utilizzatore della classe a usare dei metodi che "finiscano" di istanziare l'oggetto. Nel nostro esempio della classe vettore significa creare un oggetto vettore dove gli attributi non sono ancora tutti specificati, vettore = Vettore(), e poi usare dei metodi su questo oggetto per attribuirgli delle coordinate: vettore.Coord_Cart(x,y,z) ecc...