Se "esplicito è meglio di implicito", perché non ci sono modificatori di accesso esplicito in Python: pubblico, protetto, privato, ecc.?
So che l'idea è che il programmatore dovrebbe sapere cosa fare attraverso un suggerimento - non c'è bisogno di usare la "forza bruta". Ma "incapsulamento" o "occultamento delle informazioni" dell'IMO non è solo per tenere fuori le persone, è una questione di organizzazione e struttura: i livelli di sviluppo dovrebbero avere ambiti e confini auto-definiti e chiaramente delimitati, proprio come fanno i sistemi fisici.
Qualcuno può aiutarmi qui con una solida spiegazione del perché le restrizioni di accesso sono implicite piuttosto che esplicite in Python, un linguaggio che altrimenti sembra vicino alla perfezione?
Modifica: Finora ho visto 3 risposte proposte e mi sono reso conto che ci sono 2 parti della mia domanda:
Perché non ci sono parole chiave, per esempio
private def myFunc(): dostuff....
invece di IMO i trattini bassi brutti e difficili da scrivere. Ma non è questo il punto importante.
Ma ancora più importante:
Perché questi modificatori di accesso sono solo "raccomandazioni" o suggerimenti e non applicati. Sarà difficile cambiare in seguito? È molto semplice cambiare da 'protetto' a 'pubblico' - e se si dispone di una catena di eredità contorta che lo rende difficile, si ha un design scadente - il proprio design dovrebbe essere raffinato piuttosto che basarsi su una funzionalità linguistica che lo rende facile da scrivere codice mal strutturato.
Quando vengono applicati i modificatori di accesso, il tuo codice viene automaticamente suddiviso in compartimenti - SAPI che alcuni segmenti non rientrano nell'ambito di applicazione, quindi non devi gestirli tranne se e quando è necessario. E, se il tuo design non va bene e ti ritrovi a spostare continuamente le cose dentro e fuori da ambiti diversi, il linguaggio può aiutarti a ripulire il tuo atto.
Per quanto ami Python, trovo che questo secondo punto sia una grave carenza. E devo ancora vedere una buona risposta per questo.
private def whatever
è che si class x: def whatever(self): pass
tratta di una scorciatoia per class x: pass; x.whatever = lambda self: pass
, quindi in pratica, per l'assegnazione sarebbe necessario un modificatore privato