Quero solicitar métodos em uma classe Python, mas não sei qual é a ordem correta.
Quando extraio métodos no Eclipse com PyDev, o Eclipse coloca o método extraído no topo do método modificado. Mas isso coloca os detalhes de nível inferior antes dos detalhes de nível superior. De acordo com o tio Bob, eu deveria fazer o oposto para que meu código fosse lido como as manchetes de um jornal. Quando eu programo Java, apenas sigo seu conselho.
Qual é a prática recomendada para Python?
Respostas:
Como outros apontaram, não existe uma maneira certa de ordenar seus métodos. Talvez uma sugestão de PEP seja útil, mas enfim. Deixe-me tentar abordar sua pergunta da forma mais objetiva possível.
Interfaces primeiro: métodos públicos e funções mágicas do Python definem a interface da classe. Na maioria das vezes, você e outros desenvolvedores desejam usar uma classe em vez de alterá-la. Assim, eles estarão interessados na interface dessa classe. Colocá-lo primeiro no código-fonte evita rolar pelos detalhes de implementação que você não quer.
Propriedades, métodos mágicos , métodos públicos: é difícil definir a melhor ordem entre esses três, que fazem parte da interface da classe. Como @ EthanFurman diz, é mais importante manter um sistema para todo o projeto. Geralmente, as pessoas esperam
__init__()
ter a melhor primeira função na classe, então eu continuo com os outros métodos mágicos abaixo.Ordem de leitura: Basicamente, existem duas maneiras de contar uma história: de baixo para cima ou de cima para baixo. Ao colocar as funções de alto nível em primeiro lugar, um desenvolvedor pode obter uma compreensão aproximada da classe lendo as primeiras linhas. Caso contrário, seria necessário ler a classe inteira para obter algum entendimento da classe e a maioria dos desenvolvedores não tem tempo para isso. Como regra geral, coloque os métodos acima de todos os métodos chamados de seus corpos.
Métodos de classe e métodos estáticos: Normalmente, isso está implícito na ordem de leitura explicada acima. Os métodos normais podem chamar todos os métodos vezes e, portanto, vir primeiro. Os métodos de classe só podem chamar métodos de classe e métodos estáticos e vêm em seguida. Os métodos estáticos não podem chamar outros métodos da classe e vir por último.
Espero que isto ajude. A propósito, a maioria dessas regras não são específicas do Python. Não conheço uma linguagem que imponha a ordem dos métodos, mas se sim, seria bastante interessante e comente.
fonte
__init__
explicitamente (em combinação com__new__
) ou implicitamente (por meio do construtor padrão), de modo que seria uma razão para colocá-los juntos__init__
. (Embora eu nunca os tenha visto antes__init__
.)Não existe uma ordem correta. Escolha um sistema e fique com ele. O que eu uso é:
class SomeClass(object): def __magic_methods__(self): "magic methods first, usually in alphabetical order" def _private_method(self): "worker methods next, also in alpha order" def a_method(self): "then normal methods, also in alpha order"
fonte
@staticmethod
,@classmethod
,@property
, e quaisquer outras@decorator
linhas de modo que uso do tipo de método para determinar para onde vai (com a excepção de que as propriedades tendem a passar pelo meio_private_methods
enormal_methods
).@classmethod
s vêm depois (@classmethod def a_class_method(cls)
) e depois@staticmethod
s (@staticmethod def a_static_method()
)? Pelo menos essa é a política conforme eu entendo ... (sem meu IDE dobrar nada porque eu não gosto disso)Eu faço algo semelhante ao @Ethan que vi no código-fonte do Django, onde a principal diferença é grande "###############" Bloquear comentários para delimitar as áreas. Por exemplo,
class SomeClass(object): ################# # Magic Methods # ################# def __magic_methods__(self): "magic methods first" ################## # Public Methods # ################## def a_method(self): "then normal methods, in order of importance" ################### # Private Methods # ################### def _private_method(self): "then worker methods, grouped by importance or related function"
Obviamente, isso é menos útil para classes menores.
fonte
####
blocos feios no meio da edição quando percebi que você os colocou ali de propósito! Eu concordo com a ordem , porém, que é sobre o que esta pergunta se trata. Eu recomendo remover o####
deste exemplo, pois não pertence ao escopo da pergunta e seu exemplo é de uma classe pequena, para a qual você não usaria de####
qualquer maneira. :-)