Python è non un sistema OO messaggio basato . Invece, simili a JavaScript, le proprietà vengono risolte in funzioni di prima classe e quindi invocate; il comportamento differisce un po 'nella meccanica di tali, come scoperto.
In Python il requisito è che i metodi hanno almeno un parametro, normalmente chiamato self
, che sarà automaticamente fornito l'istanza associata quando viene invocato come metodo.
Inoltre (e forse fino al punto della domanda), Python non fa distinzione tra l'utilizzo di def f..
o f = some_func()
quando si stabiliscono i collegamenti dei membri di istanza; probabilmente questo corrisponde al comportamento al di fuori delle classi.
Nell'esempio, l'assegnazione della funzione all'istanza "fa in modo che venga considerata come un metodo di istanza". È la stessa identica funzione senza parametri chiamata in entrambi i casi; solo l'uso futuro di tale è rilevante.
Ora, a differenza di JavaScript, Python gestisce i metodi e l'associazione degli oggetti tramite il concetto di metodi associati: funzioni risolte in quanto i metodi sono sempre "vincolati".
Il comportamento di a.f
che restituisce un metodo associato, funzione che fornirà automaticamente l'oggetto associato al primo parametro come self
, viene eseguito indipendentemente dall'origine della funzione. In questo caso, ciò significa che la funzione senza parametri non può essere utilizzata quando è "vincolata" poiché non accetta un parametro self
.
A dimostrazione, la seguente fallirà nello stesso modo perché la fonte metodo sottostante non non soddisfano i requisiti minimi di accettare l'istanza come argomento:
g = a.f
g()
In questo caso chiamando g()
è equivalente a chiamare func(a)
.
Per confronto, Java, C#, Ruby, e Smalltalk sono sistemi OO messaggi basati - in questi un oggetto viene detto di richiamare un metodo da un 'nome', invece di risolvere un metodo (o funzione) come valore che può essere invocato.