L'overloading delle funzioni potrebbe non essere integrato in Python, ma ci sono modi per imitarlo.
L'overloading delle funzioni è una funzionalità di alcuni linguaggi di programmazione che consente di definire variazioni della stessa funzione. Ogni variante ha lo stesso nome, ma implementazioni diverse, con firme di funzioni uniche.
Questa tecnica consente di eseguire diverse operazioni in base al tipo e al numero di argomenti passati a una funzione.
A differenza di linguaggi come C++ e Java, Python non supporta l'overloading delle funzioni per impostazione predefinita, ma esistono modi per ottenere funzionalità simili.
In che modo Python gestisce il sovraccarico delle funzioni?
In Python, puoi definire la stessa funzione più di una volta con parametri, tipi di dati diversi o entrambi in ciascuna definizione. Tuttavia, Python riconoscerà solo l'ultima definizione della funzione quando la chiami. Ecco un esempio:
defarithmetics(a, b):
return a - bdefarithmetics(a, b, c, d):
return a + b - c * d
print(arithmetics(1, 2, 3, 5)) # returns -12
print(arithmetics(1, 2)) # returns missing positional arguments error
I linguaggi orientati agli oggetti, come Java, spesso supportano l'overload di funzioni e metodi. Un metodo è semplicemente una funzione che definisci all'interno di una classe.
Nel codice sopra, Python riconoscerà solo la seconda definizione di aritmetica() funzione quando provi a chiamarla nel tuo progetto. Se provi a chiamare la funzione con due argomenti come definiti per primi, riceverai un errore che dice "argomenti posizionali richiesti mancanti".
Non riceverai un errore quando chiami la funzione con quattro argomenti. Ciò significa che Python ha sovrascritto la funzione con la sua ultima istanza. Questo non è il comportamento del sovraccarico, quindi è necessario affrontarlo.
Quindi, Python non gestisce l'overloading delle funzioni per impostazione predefinita, ma ci sono alcuni trucchi che puoi usare per simulare il suo comportamento nei tuoi programmi.
Metodo 1: utilizzo di parametri facoltativi o argomenti predefiniti
È possibile ottenere l'overload definendo una funzione con argomenti predefiniti. Ecco un esempio:
defarithmetics(a, b=0, c=0):
Arguments:
a: The first number.
b: The second number (optional).
c: The third number (optional).
return a - b + c
Questa funzione ha tre parametri, ma due di essi hanno valori predefiniti. Ciò significa che puoi chiamarlo con da uno a tre argomenti:
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns -3
print(arithmetics(10, 3, 4)) # returns 11
Sebbene questo approccio consenta di chiamare la funzione in diversi modi, a lungo termine non è molto efficace. Ecco alcuni dei suoi limiti:
- Puoi passare solo argomenti che siano interi o in virgola mobile.
- Non vi è alcun cambiamento significativo nel comportamento della funzione. Ad esempio, non puoi modificare il suo comportamento per calcolare l'area di una forma o addirittura stamparla Ciao mondo.
Metodo 2: utilizzo di argomenti variabili
Per utilizzare argomenti variabili per l'overload delle funzioni in Python, dovresti includi il parametro args quando definisci la tua funzione. IL arg Il parametro ti consente di passare più argomenti posizionali quando chiami la funzione. Ecco un esempio:
defarithmetics(a, *args):
Arguments:
a: The first number.
*args: A variable number of arguments (optional).
args_sum = 0for num in args:
args_sum *= numreturn a - args_sum
print(arithmetics(1)) # returns 1
print(arithmetics(2, 5)) # returns 2
print(arithmetics(10, 3, 4, 2, 4, 6)) # returns 10
La funzione sopra accetta due argomenti: un argomento obbligatorio chiamato UN e il arg argomento, che ti consente di inserire tutti gli argomenti di cui hai bisogno.
Sebbene possa accettare più argomenti, la funzione sopra può eseguire solo l'operazione di moltiplicazione sugli argomenti variabili, ovvero gli argomenti rappresentati da arg parola chiave.
Se vuoi eseguire più operazioni, devi farlo introdurre istruzioni condizionali nel codicee questo può diventare rapidamente complicato.
Metodo 3: utilizzo del decoratore di invii multipli
Il decoratore di invii multipli è una libreria Python che consente di definire più implementazioni o istanze di una singola funzione, in base al tipo dei suoi argomenti. Ciò significa che puoi definire la stessa funzione con tipi di dati diversi e modificarne completamente il comportamento.
Per utilizzare il decoratore di invii multipli, attenersi alla seguente procedura:
- Installare multipledispath nel tuo ambiente Python:
pip install multipledispatch
- Decora le tue funzioni con il @spedizione decoratore. IL @spedizione il decoratore è un Decoratore pitone che ti consente di implementare invii multipli. Invierà automaticamente la funzione appropriata in base agli argomenti che le passi. Puoi usare il @spedizione decoratore seguendo questo schema:
from multipledispatch import dispatch
@dispatch(data type1, data type2, data typeX)
defyour_function(a, b, c, x):
pass
# perform your operations here
Ecco un esempio che utilizza il decoratore di invio multiplo per l'overload delle funzioni in Python:
from multipledispatch import dispatch
@dispatch(int, int)
defadd(a, b):
Arguments:
a: Any integer.
b: Any integer.
return a + b@dispatch(int, list)
defadd(a, b):
Arguments:
a: Any integer.
b: Any Python list.
b.append(a)
return b# returns 3
print(add(1, 2))
# returns [2, 3, 4, 5, 'w', 'done', 1]
print(add(1, [2, 3, 4, 5, 'w', 'done']))
Lo snippet di codice sopra definisce due istanze di aggiungere() funzione. La prima istanza accetta due numeri interi come argomenti e restituisce la loro somma.
Nel frattempo, la seconda versione di questa funzione accetta un numero intero e una lista. Aggiunge il numero intero all'elenco e restituisce il nuovo elenco.
Questo approccio all'overloading delle funzioni in Python ti offre molta flessibilità, soprattutto se devi modificare il comportamento del tuo metodo. Puoi imparare di più da documentazione di invio multiplo.
Il miglior approccio al sovraccarico delle funzioni in Python
L'approccio che adotti al sovraccarico delle funzioni dovrebbe dipendere da ciò che stai cercando di ottenere. Se riesci a completare l'attività utilizzando argomenti predefiniti o variabili, il decoratore di invii multipli potrebbe essere eccessivo. Tuttavia, il decoratore di invii multipli è solitamente l'opzione migliore per la sua efficienza e precisione.
Questo decoratore fornisce un modo pulito e flessibile per implementare l'overload delle funzioni in Python. Ti consente di definire più implementazioni di una singola funzione in base al tipo dei suoi argomenti.
Con questo approccio è possibile creare funzioni flessibili in grado di accettare diversi tipi di parametri senza la necessità di istruzioni condizionali complesse.