Estou codificando um pequeno módulo Python composto de duas partes:
- algumas funções que definem uma interface pública,
- uma classe de implementação usada pelas funções acima, mas que não é significativa fora do módulo.
No início, decidi "ocultar" essa classe de implementação definindo-a dentro da função que a usa, mas isso dificulta a legibilidade e não pode ser usado se várias funções reutilizarem a mesma classe.
Portanto, além de comentários e docstrings, existe um mecanismo para marcar uma classe como "privada" ou "interna"? Estou ciente do mecanismo de sublinhado, mas pelo que entendi, ele só se aplica a variáveis, funções e nomes de métodos.
python
access-modifiers
oparisia
fonte
fonte
Em resumo:
Você não pode impor privacidade . Não há classes / métodos / funções privadas em Python. Pelo menos, não a privacidade estrita como em outras linguagens, como Java.
Você só pode indicar / sugerir privacidade . Isso segue uma convenção. A convenção python para marcar uma classe / função / método como privada é precedê-la com um _ (sublinhado). Por exemplo,
def _myfunc()
ouclass _MyClass:
. Você também pode criar pseudo-privacidade precedendo o método com dois sublinhados (por exemplo:)__foo
. Você não pode acessar o método diretamente, mas ainda pode chamá-lo por meio de um prefixo especial usando o nome da classe (por exemplo:)_classname__foo
. Portanto, o melhor que você pode fazer é indicar / sugerir privacidade, não aplicá-la.Python é como perl nesse aspecto. Parafraseando uma frase famosa sobre privacidade do livro Perl, a filosofia é que você deve ficar fora da sala porque não foi convidado, não porque ela é defendida com uma espingarda.
Para maiores informações:
fonte
Defina
__all__
uma lista de nomes que deseja exportar ( consulte a documentação ).fonte
Um padrão que às vezes uso é este:
Defina uma classe:
Crie uma instância da classe, substituindo o nome da classe:
Defina os símbolos que expõem a funcionalidade:
Exclua a própria instância:
Agora você tem um módulo que apenas expõe suas funções públicas.
fonte
A convenção é anexar "_" a classes, funções e variáveis internas.
fonte
Para abordar a questão das convenções de design, e como disse Christopher, não existe realmente "privado" em Python. Isso pode soar distorcido para alguém vindo da formação C / C ++ (como eu há um tempo atrás), mas eventualmente, você provavelmente perceberá que seguir as convenções é o bastante.
Ver algo com um sublinhado na frente deve ser uma dica boa o suficiente para não usá-lo diretamente. Se você está preocupado com a
help(MyClass)
produção desordenada (que é o que todos olham ao pesquisar sobre como usar uma classe), os atributos / classes sublinhados não estão incluídos lá, então você acabará tendo apenas sua interface "pública" descrita.Além disso, ter tudo público tem suas próprias vantagens incríveis, como, por exemplo, você pode testar a unidade de praticamente qualquer coisa de fora (o que você realmente não pode fazer com construções privadas C / C ++).
fonte
Use dois sublinhados para prefixar nomes de identificadores "privados". Para classes em um módulo, use um único sublinhado inicial e eles não serão importados usando "do módulo import *".
(Não existe algo como "privado" verdadeiro em Python. Por exemplo, Python apenas altera automaticamente os nomes dos membros da classe com sublinhados duplos
__clssname_mymember
. Então, realmente, se você souber o nome mutilado, poderá usar a entidade "privada" de qualquer maneira . Veja aqui. E, claro, você pode escolher importar manualmente as classes "internas", se desejar.fonte