Devo sempre usare i metodi prefisso privato con un trattino basso in Python?

0

I metodi di prefisso e membri con un carattere di sottolineatura indicano uso interno . Per le classi semplici, a volte trovo più semplice la lettura e la digitazione di self.foo che superano il rientro di self._foo . Soprattutto quando si implementa un'interfaccia astratta, questa interfaccia è già abbastanza chiara. Naturalmente, la classe potrebbe avere più membri pubblici e metodi che desidera fornire. Dovrei sempre usare il trattino basso principale se qualcosa non ha bisogno di essere pubblicamente accessibile?

    
posta danijar 13.07.2016 - 12:32
fonte

1 risposta

3

In base alla sezione Classi del Documenti Python:

“Private” instance variables that cannot be accessed except from inside an object don’t exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.

_something indica agli altri che something non fa parte dell'API e può / sarà modificato senza preavviso, cioè dovrebbe essere trattato come interno / privato.

Se utilizzi l'ereditarietà, __something è una scelta migliore in quanto indica sia un dettaglio di implementazione che evita conflitti di nomi con sottoclassi.

    
risposta data 13.07.2016 - 12:51
fonte