In più situazioni OO Python canoniche, qual è la regola empirica per i modificatori di accesso predefiniti?

6

Generalmente parlando in situazioni di OOP canonico, la regola generale è quella di scrivere le classi con il minimo accesso, se necessario. cioè solo rendere pubblico solo ciò che è necessario, proteggere solo ciò che è necessario, ecc. ecc. (Ci sono delle eccezioni e quello che descrivo non si applica sempre.) FWIW, trovo l'idea di "minimo accesso se necessario" per essere utile in più situazioni canoniche OO C ++ / Java.)

Comunque in Python, non hai rigorosi modificatori di accesso come public , protected , private , ecc. Python ha pseudo protected e pseudo private sotto forma di singolo _ e double __ underscore per i campi e i metodi dell'oggetto.

In più situazioni "OO canoniche" [1] Python, qual è la regola empirica per i modificatori di accesso predefiniti?

La regola empirica è quella di restringere di più (come in C ++ / Java) e qualificare tutti i campi / metodi con __ finché non ci sono requisiti / design / API necessari per renderlo public o protected ?

O la regola generale è iniziare con tutti i tuoi campi / metodi python come public e restringerli se necessario?

Ho visto alcuni utenti che eseguono il default su protected con _ e utilizzano pylint per intercettare l'incapsulamento. Posso anche vedere gli altri che eseguiranno il default su private . E sono sicuro che ce ne sono ancora altri che sono impostati su public .

[1] Uso il termine "OO canonico" per riferirsi a più di ciò che chiamerei teoria / situazioni di programmazione del libro di testo OO. Nella mia esperienza la programmazione reale spesso differisce dalla OO di testo o dalla teoria di programmazione canonica OO.

    
posta Trevor Boyd Smith 06.04.2017 - 01:26
fonte

1 risposta

5

Prima di tutto il doppio underscore (a volte chiamato dunder ) non è inteso per essere privato, ma piuttosto una strategia di mangling dei nomi per evitare certi conflitti. Controlla questo talk di Raymond Hettinger (uno degli sviluppatori core di Python ... e l'intera conversazione vale assolutamente il tempo ). Personalmente non ho mai avuto bisogno del dribbling / mangling.

Quindi, la domanda è piuttosto su quando "proteggere" usando un carattere di sottolineatura e quando non farlo. La mia regola generale per questo è: mantenere le cose il più semplici e private possibile.

Supponiamo di avere una classe Stone con per il momento solo attributi per materiale e peso. Una ricetta potrebbe andare così:

  1. Predefinito per sottolineare tutto: _weight e _material

  2. Pensa attentamente alla API della classe e rispondi a questa domanda: quali membri devono essere esposti? . Quindi convertire questi membri in pubblico rimuovendo il carattere di sottolineatura. Diciamo che _weight viene convertito in weight

  3. Con il passare del tempo, potresti dover convertire un membro di te che non dovresti curare, in un membro pubblico a pieno titolo. Non c'è da vergognarsi, basta rimuovere il trattino basso e rifattorizzare il codice della classe in modo che corrisponda al nuovo nome, ad es. _material > %codice%. Non creare un material per accedere all'attributo precedente, è solo più complesso.

  4. Ancora una volta, col passare del tempo, può accadere che uno degli attributi dipenda da un altro, diciamo che @property diventa dipendente da weight e volume , ma non preoccuparti! ora è il momento di convertire l'attributo density in weight e conservare un'unica fonte di verità senza rompere il codice esistente.

risposta data 07.04.2017 - 12:39
fonte