Se 'explícito é melhor que implícito', por que não existem modificadores de acesso explícito no Python: Público, Protegido, Privado etc.?
Eu sei que a idéia é que o programador saiba o que fazer através de uma dica - não é necessário usar 'força bruta'. Mas o "encapsulamento" ou "ocultação de informações" da IMO não é apenas para manter as pessoas afastadas, é uma questão de organização e estrutura: suas camadas de desenvolvimento devem ter escopos e fronteiras autodefinidos e claramente delimitados, assim como os sistemas físicos.
Alguém pode me ajudar aqui com uma explicação sólida sobre por que as restrições de acesso estão implícitas e não explícitas no Python, uma linguagem que, de outra forma, parece quase perfeita?
Edit: Até agora, vi 3 respostas propostas e percebi que existem 2 partes na minha pergunta:
Por que não existem palavras-chave, por exemplo
private def myFunc(): dostuff....
em vez de IMO, os sublinhados feios e difíceis de digitar. Mas esse não é o ponto importante.
Mais importante:
Por que esses modificadores de acesso são apenas 'recomendações' ou dicas e não são impostos. Será difícil mudar mais tarde? É muito simples mudar de 'protegido' para 'público' - e se você tem uma cadeia de herança complicada que dificulta, o design é ruim - o design deve ser refinado, em vez de depender de um recurso de linguagem que facilita a escrita código mal estruturado.
Quando os modificadores de acesso são impostos, seu código é automaticamente compartimentado - você SABE que determinados segmentos estão fora do escopo, portanto você não precisa lidar com eles, exceto se e quando for necessário. E, se o seu design não é bom e você se vê constantemente movendo coisas para dentro e para fora de diferentes escopos, a linguagem pode ajudá-lo a limpar seu ato.
Por mais que eu goste de Python, considero este segundo ponto uma deficiência séria. E ainda tenho que ver uma boa resposta para isso.
fonte
private def whatever
é, queclass x: def whatever(self): pass
é um atalho paraclass x: pass; x.whatever = lambda self: pass
, então, basicamente, você precisaria de um modificator particular de cessãoRespostas:
"Explícito é melhor que implícito" é apenas uma das máximas na filosofia de design do Python. "Simples é melhor que complexo" também existe. E, embora não esteja no Zen de Python, "somos todos adultos concordantes aqui" é outro.
Essa segunda regra é talvez a mais importante aqui. Quando eu desenho uma classe, tenho uma idéia de como ela será usada. Mas não posso prever todos os usos possíveis. Ele pode ser que algum futuro uso do meu código requer acesso às variáveis tenho pensado como privado. Por que devo dificultar - ou até mesmo impossível - acessá-los, se um futuro programador (ou mesmo um futuro eu) precisar deles? A melhor coisa a fazer é marcá-los com um aviso - como observa Joonas, um único prefixo de sublinhado é o padrão - de que eles são internos e podem mudar; mas proibir completamente o acesso parece desnecessário.
fonte
Eu suspeitaria que a principal razão para os modificadores de acesso ausentes é a simplicidade
Como você diz, não se trata de manter as pessoas de fora, é sobre a organização. Portanto, o principal ponto de 'privado' é que ele envia uma mensagem aos usuários da sua API 'por favor, não escreva código que dependa disso'.
É trivial dizer 'por convenção, _x ou __x não deve ser usado fora da classe', mas no modelo de objetos dinâmicos do python, seria difícil chegar a uma notação.
como observar a acessibilidade?
Eu acho que isso foi uma troca. Se você não pode conviver estritamente com isso, sugiro ruby, que possui um nível semelhante de abstração e dinamicidade, mas possui um modelo de objeto que permite a modificação do acesso.
fonte
__x__
é 'mágica' (ou seja, métodos chamados para permitir a integração de idiomas, como sobrecarga do operador, iterabilidade etc.). A convenção é_x
.__init__
era acidental. O exemplo define algumas propriedades do objeto, que não são conhecidas em tempo de compilação, portanto, um modificador de acesso explícito não ajudaria.A convenção do Python é usar um prefixo de sublinhado para membros protegidos / privados.
Essa convenção, quando seguida, é efetivamente a mesma dos modificadores de acesso, exceto 1) você verá diretamente do nome do membro, seja público ou não, e 2) você pode quebrar o "encapsulamento" se realmente quiser (isso pode ser justificável por exemplo, testes; em alguns outros idiomas, você teria que usar reflexão == mais código).
Por fim, é uma questão de gosto, mas se você puder fazer a mesma coisa (com um pouco mais de flexibilidade) sem palavras-chave especiais, o idioma será menor e o código será mais conciso, o que geralmente é uma coisa boa.
fonte