Q:

Estructura programa Python

Estoy aprendiendo a programar en Python, se programar con Java, asi que tengo algunas dudas con respecto a el lenguaje Python. 
Mi duda es cual es la manera más correcta de hacer un programa, por ejemplo en java cada archivo debe de ser una clase, pero en Python veo que no que se puede crear un archivo y escribir código en el sin tener que crear una clase. No se si me he explicado con claridad. Gracias 

A:

En python todo lo que escribes en un fichero es código "ejecutable" para el intérprete, por lo que puedes tener un programa que sea una única línea, como este:
# holamundo.py
print("Hola mundo")

También puedes poner tus instrucciones dentro de una función, pero en ese caso debes recordar invocar la función como paso final de tu programa. A diferencia de C, que tiene main(),  no hay un "nombre mágico" para la función por la que todo arrancará. Si quieres puedes llamarla main() por costumbre, pero ese nombre no es especial para Python, por lo que tienes que recordar invocarla o no sucederá nada.
Así pues, otra versión del "Hola mundo", con funciones, sería:
# holamundo2.py
def main():
    print("Hola mundo")

main()

Todo lo que contiene este fichero es ejecutado por el intérprete, si bien la ejecución del def consiste en almacenar la definición de esa función, pero no en ejecutarla. Sólo se ejecutará cuando se le pida con main(). 
Ahora bien, un archivo .py no sólo se ejecuta cuando es invocado desde línea de comandos con el comando python. También se ejecuta cuando es importado desde otro módulo. Si tuvieras un programa como el siguiente:
# prueba.py
import holamundo2

Entonces, como consecuencia del import se cargará y ejecutará el código de holamundo2.py. Eso creará la función main(), que tendrías accesible desde prueba.py  bajo el nombre holamundo2.main(), pero también se ejecutará automáticamente pues al final de holamundo2.py hay una invocación a main().
Cuando quieres que el comportamiento sea diferente según decidas ejecutar directamente desde línea de comandos o bien importar desde otro módulo, puedes usar el siguiente patrón:
# holamundo3.py
def main():
    print("Hola mundo")

if __name__ == "__main__":
   main()

La variable __name__ es una definida automáticamente por Python, que toma el valor "__main__" cuando el script es ejecutado directamente por python, o bien toma el nombre del módulo (en este caso holamundo3) cuando es importado. De este modo consigues que al hacer python holamundo3.py se ejecute main(), pero en cambio al hacer import holamundo3 no se ejecute.
Finalmente también puedes usar programación orientada a objetos, al estilo Java, creando una clase con un método (que de nuevo puedes llamar como quieras, no hay "nombres mágicos" para que el método se ejecute automáticamente, si no tenemos en cuenta el constructor __init__()). Puedes después instanciar esa clase en un objeto e invocar cualquiera de sus métodos. Por ejemplo:
# holamundo4.py
class HolaMundo:
   # Esta clase no tiene constructor
   def main(self):
       print("Hola mundo")

if __name__ == "__main__":
     hola = HolaMundo()
     hola.main()

En un mismo fuente puedes definir todas las clases que quieras. Cuando importes ese fuente tendrás acceso a todas las clases en él definidas. De modo que también podrías hacer otro programa como este:
# prueba2
import holamundo4
hola = holamundo4.HolaMundo() 
hola.main()

Como ves tienes mucha libertad a la hora de hacer las cosas. Un patrón típico suele ser:

Si vas a usar OOP (no es obligatorio) define varias clases que estén relacionadas de algún modo entre sí, en un mismo fuente, para que otros módulos puedan importarlo y usar esas clases.
Si no vas a usar OOP puedes usar la misma técnica pero definiendo funciones de utilidad general, en vez de clases
Un programa principal importa los módulos que necesite y los usa (instanciando sus clases o invocando sus funciones). Cada import define un espacio de nombres en el que están accesibles las clases, funciones y variables globales definidas en ese módulo.
Si el programa es sencillo y se compone de un solo módulo, lo normal es al final del mismo usar el patrón del if __name__ == "__main__" para arrancar el programa por alguna de sus funciones o clases. O si no prevés que el módulo vaya a ser importado nunca por otro, puedes omitir el if __name__ == "__main__" y directamente poner al final las sentencias que arranquen la ejecución.

Los módulos se pueden organizar en paquetes, pero creo que esto ya se sale del objetivo de la pregunta.

