La tua domanda non è propriamente specifica per Python ma potrebbe essere applicata a molti linguaggi OO come C ++ o C #. Non mi sono ancora imbattuto in una dura regola, ma lo stesso pensiero mi è venuto in mente di tanto in tanto.
Quindi ciò che segue è la mia opinione:
- Metodo privato - ciò che solo la classe C dovrebbe conoscere e / o utilizzare. Nessun altro
- Metodi protetti: ciò che le nuove classi dovrebbero conoscere e / o usare.
- Metodi pubblici: quale codice esterno dovrebbe conoscere e / o utilizzare.
Quindi nel tuo esempio, renderei la funzione protetta, ma nella documentazione della classe C è molto esplicito che le classi derivate non siano destinate a chiamare direttamente questa funzione. Piuttosto, dovrebbero implementarlo e lasciare che la classe base decida quando è appropriato chiamarlo.
In altre parole, ci si aspetta che la classe derivante fornisca implementazione. Quindi, a questo punto, nulla sta fermando la persona che codifica quella classe dal chiamare quel codice. Anche se in qualche modo riesci a "contrassegnarlo come privato", dato che quella persona ha scritto quel codice una volta, lo scriverà di nuovo o troverà un altro modo per eseguirlo se è quello che lui / lei vuole veramente fare.
Per quanto riguarda ciò che è pythonic. Non sono un esperto di pitone, ma credo che questa sia la convenzione linguistica:
- nessun prefisso di sottolineatura (ad es. f ()) = funzione pubblica
- double underscore (cioè __f ()) = funzione privata
- single underscore (cioè _f ()) = funzione di uso interno
Python fa molto affidamento sulla convenzione piuttosto che sul linguaggio per impedire alle persone di accedere a date private. Nulla è veramente nascosto, ma quando si prefissa il nome della funzione con "__", l'interpretazione "mangerà" quel nome di funzione. La ragione è che scoraggia (non impedisce) alle persone di scrivere codice client che chiama funzioni private:
c = C()
c.__foo()
... risulterà nell'interprete che ti dice che la funzione non esiste. Ma se qualcuno vuole davvero chiamare la tua funzione privata, scriverà semplicemente:
c._C__foo() # mangled name (I don't remember exact
# naming rules, but point is the same)
Non raccomanderei l'uso di funzioni private in python per quelle protette. Sembra che il linguaggio sia realmente inteso "__" a segnalare al mondo esterno, comprese le classi derivate, "non toccare".
Nel tuo caso, userei il singolo "_" per segnalare che la funzione non è per il consumo pubblico / esterno ma piuttosto dovrebbe essere usata, o sovrascritta da qualcuno che ha abbastanza conoscenza della classe (cioè presumibilmente implementatore del la classe derivante è più ben informata su alcuni dettagli interni di qualcuno che scrive codice client).
Poche fonti che menzionano l'uso di "__" (double-underscore) per i simboli privati: