Classi astratte
Le classi astratte sono classi in cui alcuni metodi sulla classe mancano di implementazioni. Python può (averne) avere questi, ma non sono così espliciti come lingue come Java, dove il programma si rifiuterà di costruire. Tipicamente, si eredita da una classe astratta e si riempiono i pezzi mancanti, eventualmente usando metodi non astratti dalla classe base astratta. Considera questa classe, in Python:
class Foo(object):
def bar(self):
# code code code
def baz(self):
raise NotImplementedError()
Questa classe è tipo di come una classe astratta: non possiamo (realisticamente) chiamare baz
. (Possiamo, ma otterremo solo eccezioni.) A differenza di Java o C ++, dove una classe astratta è una che non può essere istanziata, possiamo istanziare Foo
. Python fornisce il modulo abc
se vuoi più classi "astratte".
Funzioni virtuali
Le funzioni virtuali sono funzioni che, chiamate da un riferimento o un puntatore a una classe base, chiameranno la versione derivata di quella funzione. In C ++, se ho:
Foo *foo = ClassDerivedFromFoo();
foo->bar();
Se la barra non è virtuale, verrà chiamato Foo::bar
. Se lo è, ClassDerivedFromFoo::bar
verrà chiamato, se esiste. (La versione più derivata verrà chiamata.)
In Python, una semplificazione eccessiva sarebbe che si possa pensare a tutte le funzioni come virtuali. Questo non è del tutto corretto: le funzioni di un'istanza sono in realtà solo attributi su quell'istanza, e puoi facilmente "convertirle in patch" per essere una funzione arbitraria.
Contratto
Un contratto è un accordo tra una funzione e un chiamante di una funzione riguardo a cose che accadono durante l'esecuzione di una funzione. È essenzialmente la garanzia di una funzione. A mia conoscenza, nessuno di Python / Java / C ++ li applica esplicitamente. Vedi Progetta per contratto .
Interfaccia
In senso sciolto, un'interfaccia è l'API (si noti che l'interfaccia "I" è ) mostra una parte di codice (modulo, classe, funzione, ecc.): consiste di quali chiamate di funzione sono disponibili, quali tipi di dati prendono e restituiscono e quali devono essere i dati da comporre.
Java ha un significato speciale per l'interfaccia: un'interfaccia è una descrizione simile alla classe che contiene funzioni membro che non contengono alcun corpo. Una classe che contiene tutte queste funzioni quindi "implementa" quell'interfaccia. L'interfaccia può essere utilizzata come una classe base di sorta.
Python ha concetti simili, ma molto più astratti. Prendi la funzione enumerate
. Richiede un "iterable" e restituisce gli elementi da quel iterable accoppiato con numeri interi crescenti. (Se lo nutrite ['a', 'b', 'c']
sputa (0, 'a'), (1, 'b'), (2, 'c')
. Il mio esempio era una lista, ma prenderà felicemente qualsiasi iterable: set, dizionari, generatori, tuple, ecc. Finché l'articolo incontra interfaccia di un iterabile Questa interfaccia non è (in Python) registrata esplicitamente, ma finché l'oggetto che si passa agisce come un iterabile, tutto dovrebbe funzionare (questa è la digitazione anatra).
L'idea di "interfaccia" Java è strettamente correlata all'idea generale di classi base astratte, e alcune delle cose che abc
che il modulo può fare potrebbe essere interessante anche per quanto riguarda le interfacce.