Javascript utilizza un modello basato su prototipo per i suoi oggetti. Tuttavia, il linguaggio è molto flessibile, ed è facile scrivere in poche righe funzioni che sostituiscono altri tipi di costrutti. Ad esempio, è possibile creare una funzione class
, emulando il comportamento della classe standard, inclusi ereditarietà o membri privati. Oppure si possono usare strumenti funzionali mimetici scrivendo, ad esempio, una funzione curry
che prenderà una funzione e alcuni dei suoi argomenti e restituirà la funzione parzialmente applicata.Programmazione Prototipale in Python
Mi chiedevo se è possibile fare il contrario e imitare il metodo prototipale in più lingue classiche. In particolare, ho pensato un po 'alla possibilità di imitare i prototipi in Python, ma la mancanza di supporto per le funzioni anonime (più generale di lambdas) mi lascia bloccato.
È possibile scrivere alcune funzioni per simulare i prototipi in linguaggi basati su classi, in particolare in Python?
EDIT Vi faccio qualche esempio di come si potrebbe andare l'attuazione di una cosa del genere (ma non sono realmente in grado di fare tutto).
In primo luogo, la cosa che più strettamente assomiglia agli oggetti Javascript è un dizionario Python. Così abbiamo potuto oggetti semplici come
foo = {
'bar': 1,
'foobar': 2
}
Naturalmente vogliamo aggiungere il metodo, e questo non è un problema fino a quando il metodo si inserisce in una lambda
foo = {
'bar': 1,
'foobar': 2,
'method': lambda x: x**2
}
Così ora possiamo chiamare per esempio
foo['method'](2)
>>> 4
Ora se avessimo funzioni arbitrarie come metodi potremmo andare avanti così. Per prima cosa abbiamo bisogno che le funzioni all'interno di foo
abbiano accesso allo stesso foo
; altrimenti sono solo funzioni ordinarie e non metodi.
immagino si potrebbe farlo applicando una funzione makeObject
a foo
, che scorre foo
valori e, ogni volta che trova un valore che è richiamabile, modifica la propria attributo __call__
passare foo
come primo parametro.
A questo punto avremmo oggetti autonomi, che possono essere dichiarati senza bisogno di creare classi.
Quindi dobbiamo essere in grado di fornire a foo
un prototipo, che può essere passato come secondo argomento della funzione makeObject
. La funzione dovrebbe modificare foo.__getattr__
e foo.__setattr__
come segue: ogni volta che l'attributo non viene trovato in foo
, deve essere cercato in foo.prototype
.
Quindi, penso che sarei in grado di implementarlo, aspetto una cosa: non riesco a pensare in alcun modo a dichiarare metodi più complicati di lambda, tranne che per dichiararli in anticipo e allegarli al mio oggetto. Il problema è la mancanza di funzioni anonime. Ho chiesto qui perché forse qualche guru di Python potrebbe trovare un modo intelligente per aggirare questo.
Può fare un esempio di ciò che si vuole fare, e come avrebbe "prototipale" guardare la programmazione in Python nella tua visione? –
Non so esattamente come sarebbe. Ma per un esempio del contrario (come l'OOP classico appare in Javascript) puoi vedere ad esempio http://ejohn.org/blog/simple-javascript-inheritance/ – Andrea
currying non ha nulla a che fare con prototipi o classi. Le classi di Python sono già abbastanza equivalenti ai prototipi, dato che puoi cambiarle liberamente o sottoclassarle in fase di runtime. –