Are a class's methods a type of closure?
No. Una chiusura è un tipo di funzione molto specifico. Come dice Wikipedia, implementano lo scope lessicale .
Chiusure
In Python, una tale chiusura sarebbe simile a questa:
def startAt(x):
def incrementBy(y):
return x + y
return incrementBy
La variabile x
è vincolata (nel caso di Python, immutabilmente) nella incrementBy
che viene creata quando viene chiamato startAt
. ( x
potrebbe molto bene essere una struttura dati mutevole, o l'implementazione della tua lingua potrebbe permetterti di cambiarla.)
Per contrasto, ecco un esempio di funzione senza chiusura che utilizza un globale:
x = 0
def incrementBy(y):
return x + y
Qui c'è una singola funzione, incrementBy
, e ogni volta che x cambia sull'ambito globale, si riflette nella funzione:
>>> incrementBy(5)
5
>>> x = 1
>>> incrementBy(5)
6
Metodi
I metodi, d'altra parte, hanno accesso a variabili mutabili. Se sono metodi di istanza, conoscono la loro istanza e quindi la classe. Se sono metodi di classe, conoscono la loro classe. Anche se si tratta di metodi statici, non conoscendo la classe o l'istanza, possono ancora utilizzare le globali. I globals possono essere riassegnati a piacere e possono quindi modificare gli output della funzione per ogni dato.
puoi fare una chiusura in un metodo aggiunto a una classe, a seconda dell'implementazione della tua lingua:
class Foo(object):
ib5 = staticmethod(startAt(5))
>>> Foo.ib5(3)
8
>>> Foo.ib5
<function incrementBy at 0x7f29e978b758>
Ma non penso che sia ciò che intendi veramente fare.
Che cos'è una chiusura?
Una chiusura è una funzione interna che lega le variabili ad essa dall'ambito della funzione esterna. Se il metodo di una classe non lo fa, non è una chiusura.
Metodi di confronto e contrasto e chiusure
Ciò che hanno in comune, è la combinazione di funzionalità con i dati.
Dove contrastano le chiusure collegano i dati alla funzionalità, mentre i metodi legano la funzionalità alle strutture di dati. Quindi non sarebbe corretto chiamare un metodo un tipo di chiusura a meno che non sia realmente una chiusura.
Direi che molti metodi della classe non lo fanno, ma permetterò che ci possano essere ambienti in cui questa è una tecnica riconosciuta. Sarei molto interessato a sapere chi sta usando questo e qual è la loro giustificazione.
Personalmente non l'ho mai visto fare in natura.