Quando usar métodos privados em Python

9

Eu tenho uma classe, mas todos os métodos devem ser privados (além de forma __init__e __str__). Devo denotar todos os métodos com um sublinhado duplo ou isso é considerado uma má prática?


fonte
Ouvi dizer que qualquer coisa em Python é pública e você deve se organizar quando usá-las. Não gosto muito da parte avançada do OO, mas é isso que me resta a respeito.
dragões
2
Apenas para sua informação, a troca de nomes é projetada para evitar colisões com nomes comumente usados, não para privacidade.
detly
Para uma resposta precisa da @detly: não "nomes comumente usados", mas nomes usados ​​nas subclasses. "Como existe um caso de uso válido para membros privados de classe (ou seja, para evitar conflitos de nomes com nomes definidos por subclasses), há suporte limitado para esse mecanismo, chamado de manipulação de nomes". docs.python.org/3/tutorial/classes.html#private-variables Para evitar colisão com um nome interno, use um sublinhado à direita (lista_).
Yaroslav Nikitenko

Respostas:

16

Os métodos privados verdadeiros - aqueles que não podem ser vistos ou usados ​​fora de uma classe - não existem no Python. O que temos são convenções que são meramente sugestões para não tocar nas coisas que você não deveria.

O mais próximo que você chega da privacidade é de nomes desconcertantes. Um atributo de MyClass nomeado __some_attrserá renomeado _MyClass__some_attrinternamente, tornando um pouco estranho referenciá-lo de fora da classe. Isso raramente é usado. O que a maioria das pessoas faz é simplesmente colocar um único sublinhado ( _attr) como uma notação de que algo não deve ser invocado e não faz parte da interface pública.

O uso de sublinhados duplos antes e depois do identificador, embora não seja proibido, é considerado reservado para detalhes do idioma interno (como métodos 'mágicos'). Você não deve sair com novos __attr__s (a menos que esteja hackeando o intérprete).

Sean McSomething
fonte
10
Essas diretrizes estão documentadas no Pep 8 .
Brian
E os casos em __some_attrque não serão mencionados fora da classe? Não seria bom usar sublinhado duplo à esquerda?
Paradoxo Fermi
@ user5061 - tecnicamente um uso correto, mas desaprovado. Isso torna a introspecção mais difícil.
31515 Sean McSomething