Pergunta

Venho de uma área onde normalmente crio um arquivo por classe.Eu também organizo aulas comuns em diretórios.Esta prática é intuitiva para mim e provou ser eficaz em C++, PHP, JavaSript, etc.

Estou tendo problemas para trazer esta metáfora para Python:arquivos não são mais apenas arquivos, mas são módulos formais.Não parece certo ter apenas uma classe em um módulo – a maioria das classes é inútil por si só.Se eu tiver um automobile.py e um Automobile classe, parece bobagem sempre referenciá-lo como automobile.Automobile também.

Mas, ao mesmo tempo, não parece certo colocar uma tonelada de código em um arquivo e encerrar o dia.Obviamente, uma aplicação muito complexa deve ter mais de 5 arquivos.

Qual é a maneira correta --- ou pitônica ---?(Ou se não houver uma maneira correta, qual é a sua maneira preferida e por quê?) Quanto código devo inserir em um módulo Python?

Foi útil?

Solução

Pense em termos de uma "unidade lógica de embalagem" - que pode ser uma única classe, mas mais frequentemente será um conjunto de classes que cooperarão de perto. As classes (ou funções no nível do módulo-não "faça java in python", sempre usando métodos estáticos quando as funções no nível do módulo também estão disponíveis como uma escolha!-) podem ser agrupadas com base nesse critério. Basicamente, se a maioria dos usuários também precisa de B e vice -versa, A e B provavelmente devem estar no mesmo módulo; Mas se muitos usuários precisarão apenas de um deles e não o outro, provavelmente deveriam estar em módulos distintos (talvez no mesmo pacote, ou seja, diretório com um __init__.py arquivo nele).

A biblioteca Python padrão, embora longe de perfeita, tende a refletir (principalmente) práticas razoavelmente boas - para que você possa aprender principalmente com ela pelo exemplo. Por exemplo, o threading Módulo, é claro, define um Thread Classe ... mas também possui as classes primitivas de sincronização, como bloqueios, eventos, condições e semáforos, e uma classe de exceção que pode ser aumentada por operações de encadeamento (e mais algumas coisas). Está no limite superior do tamanho razoável (800 linhas, incluindo espaço em branco e doces), e algumas funcionalidades cruciais relacionadas a roscas, como a fila, foram colocadas em um módulo separado, no entanto, é um bom exemplo de qual quantidade máxima de funcionalidade ainda faz sentido Para embalar em um único módulo.

Outras dicas

Se você quiser seguir seu sistema de uma classe por arquivo (que é lógico, não me entenda mal), você pode fazer algo assim para evitar ter que se referir a automobile.Automobile:

from automobile import Automobile
car = Automobile()

No entanto, como mencionado por Cobbal, mais de uma classe por arquivo é bastante comum no Python. De qualquer forma, desde que você escolha um sistema sensível e o use de forma consistente, não acho que nenhum usuário do Python fique bravo com você :).

Se você estiver vindo do ponto de vista c++, poderá visualizar módulos python semelhantes a .so ou .dll.Sim, eles se parecem com arquivos de origem, porque o python é programado, mas na verdade são bibliotecas carregáveis ​​​​com funcionalidades específicas.

Outra metáfora que pode ajudar é que você pode considerar os módulos python como namespaces.

Em um projeto de tamanho médio, eu me encontrei com vários conjuntos de classes intimamente relacionadas. Vários desses conjuntos agora estão agrupados em arquivos; por exemplo, as classes de rede de baixo nível estão todas em um único network módulo. No entanto, algumas das maiores classes foram divididas em seu próprio arquivo.

Talvez a melhor maneira de iniciar esse caminho a partir de uma história de uma classe por arquivo seja fazer as aulas que você normalmente colocaria no mesmo diretório e mantê-las no mesmo arquivo. Se esse arquivo começar a parecer muito grande, divida -o.

Como uma orientação vaga: mais de 1 classe por arquivo é a norma para o Python

Veja também Quantas aulas de Python devo colocar em um arquivo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top