Non chiami il Framework, ti chiama

6

Ho bisogno di una spiegazione chiara e forse un esempio di come funzionano framework come JavaFX, Tkinter ecc.

Diamo a Python's Tkinter. Quando lego un'azione di un pulsante, faccio semplicemente

def callback():
    print "clicked!"

b = Button(text="click me", command=callback)

In qualche modo conferisco la funzione callback come parametro alla classe Button e quindi la attiva quando necessario.

Ma come posso scrivere una classe, che eseguirà un metodo definito in seguito? Potresti per favore darmi un breve esempio?

    
posta CuriousGuy 28.03.2016 - 00:32
fonte

2 risposte

7

In python, una variabile può contenere qualsiasi cosa; che include (ma non limitato a) un numero, una stringa, un oggetto di classe o .. una funzione.

Come probabilmente già saprai, l'uso di (cioè le cose che puoi fare con ) una variabile Python dipende da qualsiasi cosa esso contenga.

Ad esempio, probabilmente hai visto che una variabile contenente una stringa può essere utilizzata con la manipolazione delle stringhe, proprio come si eseguirebbero le stesse operazioni direttamente su una stringa non elaborata.

Che cosa puoi fare con una variabile contenente una funzione? Risposta: esattamente la stessa cosa che puoi fare con una funzione direttamente ...

(... Ma ricorda che quando si copia una funzione in una variabile, quella funzione viene identificata solo dal suo nome, senza parentesi, perché la parentesi chiamerà la funzione e otterrà il suo valore di ritorno).

Come si assegna una funzione a una variabile? Risposta: esattamente nello stesso modo in cui assegni qualsiasi altro tipo di variabile:

def say_hello():
    print "Hello"

meow = say_hello   # Note: no parenthesis.
meow()          # Call the say_hello function, indirectly via 'meow'

Come immagazzini una variabile di funzione in una classe? Risposta: esattamente nello stesso modo in cui memorizzi qualsiasi altro tipo di variabile in una classe:

def say_hello():
    print "Hello"

class Foo:
    def __init__(self, callback):
        self.callback = callback   # just another variable...

    def do_it():
        self.callback()   # "calling" the variable with parenthesis 
                          # because it's expected to be a function.

meow = Foo(say_hello)
meow.do_it()

Cerca di non pensarci troppo o di rimanere bloccato dal fatto che la variabile contiene una funzione piuttosto che un altro tipo di dati / oggetto. Una variabile è una variabile indipendentemente da cosa si trovi.

Infine, come probabilmente già saprai, una funzione viene chiamata usando le parentesi con argomenti. vale a dire say_hello("hello") .

Se esiste una funzione in una variabile, la funzione può essere richiamata usando la sintassi della funzione con la variabile. vale a dire my_little_callback() .

    
risposta data 28.03.2016 - 01:29
fonte
8

Come molti linguaggi di scripting con tipi dinamici, nelle funzioni Python sono valori di prima classe , il che significa che possono essere passati e restituiti dalle funzioni come qualsiasi altro valore ordinario. Quindi la risposta diretta alla tua domanda è "fallo e basta, non c'è niente che ti fermi".

def square(n):
    return n * n

def do_twice(func, arg):
    return func(func(arg))

print do_twice(square, 2) // 16

Dato che hai citato JavaFX, nella maggior parte delle tradizionali lingue con funzioni tipizzate staticamente non sono automaticamente valori di prima classe. C #, insieme a versioni più recenti di Java e C ++, forniscono modi per definire funzioni che sono valori di prima classe quando ne hai bisogno. Ma per molto tempo l'unico modo per aggirare i "richiami" in queste lingue era di passare attorno agli oggetti che avevano i callback desiderati come metodi. JavaFX sembra avere una classe di callback per questo scopo.

    
risposta data 28.03.2016 - 00:47
fonte

Leggi altre domande sui tag