2009-05-27 22 views
16

Principalmente mi chiedo se Python abbia qualche difetto OOP come PHP. PHP ha sviluppato le sue pratiche OOP per le ultime versioni. Sta migliorando in PHP, ma non è ancora perfetto. Sono nuovo di Python e mi chiedo se il supporto OOP di Python sia migliore o semplicemente comparabile.Come Python OOP confronta con PHP OOP?

Se ci sono alcuni problemi in Python OOP che non seguono le pratiche OOP corrette, mi piacerebbe sicuramente conoscerli. PHP per esempio, non consente l'ereditarietà multipla per quanto ne so.

Grazie a tutti!

Modifica: Che ne dici del supporto per pubblico e privato? o supporto di tipi variabili. Penso che questi siano importanti per quanto riguarda la creazione di software OOP.

+15

Da quando l'ereditarietà multipla è "OOP corretto"? Java non supporta l'ereditarietà multipla. Qual è il tuo standard per "OOP corretto"? Puoi fornire link o una definizione? –

+1

Dipende da cosa si definisce "corretto". Molti linguaggi OOP (Java, Objective-C, C#) non consentono l'ereditarietà multipla. – Nosredna

+2

PHP non consente l'ereditarietà multipla in base alla progettazione. Probabilmente Python segue anche questa pratica. È comune nella maggior parte dei moderni linguaggi OOP, poiché l'ereditarietà multipla può causare molti mal di testa poiché la maggior parte delle persone non la utilizza correttamente. –

risposta

21

Direi che il supporto OOP di Python è molto meglio dato che è stato introdotto nella lingua nella sua infanzia rispetto a PHP che ha imbastito OOP su un modello procedurale esistente.

+0

Interessante. Ho pensato che le lezioni fossero state aggiunte relativamente tardi nello sviluppo di Python, ma una lettura del blog di Guido dice che è stata aggiunta prima della prima versione pubblica. –

+0

Jason: Sono stati revisionati però. – troelskn

+0

1+ per Python. OOP in PHP è un casino. Non sto cercando di promuovere Python ad altri sviluppatori (cioè, meno lavoro per me) ma ho iniziato con PHP e dopo aver codificato in Python non avrei preso un progetto PHP per meno di 5x il suo costo reale (cioè, una piccola dinamica sito web in CodeIgniter per 50k, nessuna esagerazione). Nessuno pagherebbe molto però, quindi penso che tu abbia la foto. – orokusaki

3

Penso che siano paragonabili a questo punto. Come semplice test, dubito che ci siano dei pattern in Design Patterns o Patterns of Enterprise Application Architecture, probabilmente i due libri più influenti in OOP, che è impossibile implementare in entrambe le lingue.

Entrambe le lingue hanno fatto passi da gigante dalle loro fazioni.

Per quanto riguarda l'ereditarietà multipla, spesso è creates more problems than it solves ed è, in questi giorni, comunemente lasciato fuori dalle lingue come decisione intenzionale di progettazione.

+9

È anche possibile implementare qualsiasi modello di progettazione in C. È C come orientato agli oggetti come Pitone? –

+0

Um. Il link all'articolo di Wikipedia descrive i problemi che l'MI ha e come sono trattati in varie lingue. La soluzione Python (la MRO) è anche descritta nell'articolo. Non sono sicuro di ciò che ottieni collegando all'articolo. – tzot

8

Il supporto OOP di Python è molto forte; esso consente l'ereditarietà multipla e tutto è manipolabile come oggetto di prima classe (incluse classi, metodi, ecc.).

Il polimorfismo viene espresso tramite la digitazione anatra. Ad esempio, è possibile scorrere su un elenco, una tupla, un dizionario, un file, una risorsa Web e molto altro allo stesso modo.

Ci sono un sacco di piccole cose pedanti che non sono debitamente OO, come ottenere la lunghezza di una sequenza con len (lista) piuttosto che list.len(), ma è meglio non preoccuparsi di loro.

+6

Con "debatably not OO" intendi "non tipica sintassi OO?" È chiaramente OO, poiché è il metodo __len__ dell'oggetto. –

+3

@S. Lott - Sospetto che sia esattamente ciò che intende. L'implementazione è correttamente OO, ma la sintassi no. La lunghezza della sequenza è un aspetto dell'oggetto della sequenza; idealmente, la sintassi del linguaggio lo esprimerebbe in quel modo. –

+3

@ Ben: l'implementazione non è più importante della sintassi? O consideri il sovraccarico dell'operatore "non corretto OOP", perché la sintassi è errata? Preferiresti 1.minus() a -1 perché è più OO? Non riesco davvero a vedere come le persone possono lamentarsi della questione len. – nikow

3

Inoltre: Python ha un overloading operatore nativo, a differenza di PHP (sebbene esista un'estensione). Lo adori o lo odi, è lì.

1

Se stai cercando un OOP "più puro", dovresti guardare SmallTalk e/o Ruby.

PHP è cresciuto considerevolmente con il supporto per OOP, ma a causa del modo in cui funziona (ricarica ogni volta ogni volta), le cose possono diventare molto lente se vengono seguite le migliori pratiche OOP. Questo è uno dei motivi per cui non si sente molto parlare di PHP su Rails.

+0

E anche perché le capacità di metaprogrammazione di PHP non possono eguagliare quelle di Ruby, Smalltalk o Python. –

7

Un aspetto del modello OOP di Python che è insolito è il suo meccanismo di incapsulamento. Fondamentalmente, Python presuppone che i programmatori non facciano cose cattive, e quindi non si sforza in alcun modo di proteggere le variabili oi metodi dei membri privati.

Funziona maneggiando i nomi dei membri che iniziano con due trattini bassi e terminano con meno di due. Tali identificatori vengono dappertutto cambiati in modo che abbiano il nome della classe anteposto, con un carattere di sottolineatura aggiuntivo prima di quello.in tal modo:

class foo: 
    def public(self): 
     return self.__private() 
    def __private(self): 
     return 5 

print foo().public() 
print foo()._foo__private() 

nomi che iniziano e terminano con due (o più) di sottolineatura non sono alterati, in modo __init__ il metodo pitone utilizza per la costruzione di nuove istanze, è lasciato solo.

Ecco uno link che lo spiega in modo più dettagliato.

+0

Altro modo: i nomi che iniziano con due trattini bassi (e finiscono con meno di 2 caratteri di sottolineatura) vengono storpiati, ma altri nomi no. – mipadi

+0

@TokenMacGuy: si prega di correggere la risposta piuttosto che dire "un po 'errata". Le proprietà –

+1

possono essere utilizzate per controllare il modo in cui si accede agli attributi, ma a volte mi piacerebbe avere veri attributi privati ​​ –