2009-04-03 11 views
14

Con mia sorpresa sto sviluppando più interesse verso linguaggi dinamici come Ruby e Python. L'affermazione è che sono al 100% orientati agli oggetti, ma mentre leggo su diversi concetti di base come le interfacce, l'overloading dei metodi, l'overloading dell'operatore manca. È in qualche modo integrato nella copertina o fa queste lingue semplicemente non ne ha bisogno? Se quest'ultimo è vero, sono orientati all'obiettivo al 100%?Perché i linguaggi dinamici come Ruby e Python non hanno il concetto di interfacce come in Java o C#?

MODIFICA: Sulla base di alcune risposte, vedo che l'overloading è disponibile sia in Python che in Ruby, è il caso in Ruby 1.8.6 e Python 2.5.2 ??

+0

Non ricordo il sovraccarico del metodo o il sovraccarico dell'operatore come requisito per un linguaggio OO. Tuttavia, ho sentito l'argomento che non sono OO. –

+0

Di tutte le lingue che hai citato, Java è l'unico senza sovraccarico dell'operatore. E l'overloading del metodo non è legato a OOP; C ha un sovraccarico di metodo. – Pesto

+0

È possibile sovraccaricare gli operatori in Ruby 1,8,6 –

risposta

18

Grazie al binding in ritardo, non ne hanno bisogno. In Java/C#, le interfacce vengono utilizzate per dichiarare che alcune classi hanno determinati metodi e vengono verificate durante la compilazione; in Python, se un metodo esiste viene verificato durante il runtime.

overloading dei metodi in Python funziona:

>>> class A: 
... def foo(self): 
... return "A" 
... 
>>> class B(A): 
... def foo(self): 
... return "B" 
... 
>>> B().foo() 
'B' 

Sono orientato agli oggetti? Direi di si. È più un approccio piuttosto che se un linguaggio concreto ha la funzione X o la funzione Y.

+18

Mi dispiace che non si stia sovraccaricando il metodo. Quello che stai facendo è il metodo che ha la precedenza. Sovraccarico metodo/funzione è la capacità di riutilizzare lo stesso nome ma con una firma diversa come in: func a (String a); func a (Int a) ;. Nell'esempio si utilizza un metodo con la stessa firma, ma sovrascritto in una sottoclasse. [Wikipedia - Sovraccarico] (http://en.wikipedia.org/wiki/Function_overloading) e [Wikipedia - Overriding] (http://en.wikipedia.org/wiki/Method_overriding) – dryajov

18

Le lingue dinamiche utilizzano duck typing. Qualsiasi codice può chiamare metodi su qualsiasi oggetto che supporta tali metodi, quindi il concetto di interfacce è estraneo. Python supporta infatti lo operator overloading, così come lo Ruby.

Ad ogni modo, sembra che ti concentri su aspetti che non sono essenziali per object oriented programming. L'obiettivo principale è su concetti come incapsulamento, ereditarietà e polimorfismo, che sono supportati al 100% in Python e Ruby.

5

Posso parlare solo per Python, ma ci sono have been proposals for interfaces e anche esempi di interfaccia scritti in casa in passato.

Tuttavia, il modo in cui Python funziona con gli oggetti tende a ridurre dinamicamente la necessità di (e il vantaggio di) interfacce in una certa misura.

Con un linguaggio dinamico, l'associazione del tipo avviene in fase di esecuzione: le interfacce sono principalmente utilizzate per vincoli di tempo di compilazione sugli oggetti, se ciò accade in fase di esecuzione, elimina parte della necessità di interfacce.

2

name based polymorphism

"Per quelli di voi non hanno familiarità con Python, ecco una rapida introduzione al nome a base di polimorfismo. Oggetti Python hanno un dizionario interno che contiene una stringa per ogni attributo e metodo. Quando si accede a un attributo o metodo in codice Python, Python cerca semplicemente la stringa nel dict. Pertanto, se quello che vuoi è una classe che funziona come un file, non è necessario ereditare dal file, basta creare una classe che ha i metodi di file

Python definisce anche una serie di metodi speciali che vengono richiamati dalla sintassi appropriata, ad esempio a + b equivale a A. aggiungere (b). Ci sono alcuni punti all'interno di Python che manipolano direttamente oggetti built-in, ma il polimorfismo basato sul nome funziona come ci si aspetta circa il 98% delle volte. "

1

Python fornisce sovraccarico dell'operatore, ad esempio è possibile definire un metodo __add__ se si desidera sovraccaricare +.

In genere non è necessario fornire l'overloading del metodo, poiché è possibile passare parametri arbitrari in un unico metodo. In molti casi, quel singolo metodo può avere un singolo corpo che funziona per tutti i tipi di oggetti nello stesso modo. Se si desidera avere un codice diverso per diversi tipi di parametri, è possibile controllare il tipo o la doppia spedizione.

Le interfacce sono per lo più inutili a causa della digitazione anatra, come sottolinea Rossfabricant. Alcuni casi rimanenti sono coperti in Python da ABC (astratte classi base) o interfacce Zope.

Problemi correlati