Quiero ordenar métodos en una clase de Python pero no sé cuál es el orden correcto.
Cuando extraigo métodos en Eclipse con PyDev, Eclipse coloca el método extraído encima del método modificado. Pero esto coloca los detalles de nivel inferior antes que los detalles de nivel superior. Según el tío Bob, debería hacer lo contrario para que mi código se lea como los titulares de un periódico. Cuando programo Java, simplemente sigo sus consejos.
¿Cuál es la mejor práctica para Python?
Respuestas:
Como han señalado otros, no existe una forma correcta de ordenar sus métodos. Quizás una sugerencia de PEP sería útil, pero de todos modos. Permítame intentar abordar su pregunta de la manera más objetiva posible.
Interfaces primero: los métodos públicos y las funciones mágicas de Python definen la interfaz de la clase. La mayoría de las veces, usted y otros desarrolladores desean utilizar una clase en lugar de cambiarla. Por lo tanto, estarán interesados en la interfaz de esa clase. Ponerlo en primer lugar en el código fuente evita desplazarse por los detalles de implementación que no le interesan.
Propiedades, métodos mágicos , métodos públicos: es difícil definir el mejor orden entre esos tres, que son parte de la interfaz de la clase. Como dice @EthanFurman, es más importante seguir con un sistema para todo el proyecto. En general, la gente espera
__init__()
la mejor primera función en la clase, así que sigo con los otros métodos mágicos que se encuentran a continuación.Orden de lectura: Básicamente, hay dos formas de contar una historia: de abajo hacia arriba o de arriba hacia abajo. Al poner las funciones de alto nivel en primer lugar, un desarrollador puede obtener una comprensión aproximada de la clase leyendo las primeras líneas. De lo contrario, uno tendría que leer toda la clase para comprender la clase y la mayoría de los desarrolladores no tienen tiempo para eso. Como regla general, coloque los métodos por encima de todos los métodos llamados desde su cuerpo.
Métodos de clase y métodos estáticos: por lo general, esto está implícito en el orden de lectura explicado anteriormente. Los métodos normales pueden llamar a todos los métodos tiempos y, por lo tanto, vienen primero. Los métodos de clase solo pueden llamar a métodos de clase y métodos estáticos y vienen a continuación. Los métodos estáticos no pueden llamar a otros métodos de la clase y son los últimos.
Espero que esto ayude. Por cierto, la mayoría de estas reglas no son específicas de Python. No conozco un lenguaje que imponga el orden de los métodos, pero si es así, sería bastante interesante y por favor comente.
fuente
__init__
explícitamente (en combinación con__new__
) o implícitamente (a través del constructor predeterminado), por lo que sería una razón para colocarlos junto con__init__
. (Aunque nunca los había visto colocados antes__init__
)No hay un orden correcto. Elija un sistema y apéguese a él. El que yo uso es:
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"
fuente
@staticmethod
,@classmethod
,@property
, y cualesquiera otras@decorator
líneas así que utilizo el tipo del método para determinar a dónde va (con la excepción de que las propiedades tienden a ir entre_private_methods
ynormal_methods
).@classmethod
s viene después (@classmethod def a_class_method(cls)
) y luego@staticmethod
s (@staticmethod def a_static_method()
)? Al menos esa es la política tal como la entiendo ... (sin que mi IDE doble nada porque no me gusta)Hago algo similar a @Ethan que vi en el código fuente de Django, donde la principal diferencia es un gran bloque de comentarios "###########" para delimitar las áreas. Por ejemplo,
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, esto es menos útil para clases más pequeñas.
fuente
####
bloques feos cuando me di cuenta de que los pondrías allí a propósito. Sin embargo, estoy de acuerdo con el pedido , que es de lo que trata esta pregunta. Recomendaría eliminar el####
de este ejemplo, ya que no pertenece al alcance de la pregunta y su ejemplo es de una clase pequeña, por lo que no usaría de####
todos modos. :-)