{"cells": [{"cell_type": "markdown", "id": "b2799b1a", "metadata": {}, "source": ["# Un bref aper\u00e7u des classes\n", "\n", "Les classes ou la programmation objet est une fa\u00e7on diff\u00e9rente d'\u00e9crire et d'organiser un programme informatique. Cela ne permet rien de plus que les fonctions mais \u00e7a permet de le faire souvent de fa\u00e7on plus \u00e9l\u00e9gante."]}, {"cell_type": "code", "execution_count": 1, "id": "034b7c6b", "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "id": "c5d41751", "metadata": {}, "source": ["## Une station de m\u00e9tro\n", "\n", "Une station de m\u00e9tro est d\u00e9finie par son nom et sa position. Un dictionnairre peut suffire."]}, {"cell_type": "code", "execution_count": 2, "id": "abdebcd5", "metadata": {}, "outputs": [], "source": ["station = {'name': 'Charles Michels', 'lat': 48.846651, 'lng': 2.285811}"]}, {"cell_type": "markdown", "id": "202c7ef9", "metadata": {}, "source": ["L'inconv\u00e9nient de cette \u00e9criture est qu'il faut toujours bien orthographier le nom des cl\u00e9s du dictionnaire. La moindre erreur emp\u00eache le programme de fonctionner. La seconde \u00e9criture avec des classes ne simplifie pas la t\u00e2che \u00e0 premi\u00e8re vue. Mais..."]}, {"cell_type": "code", "execution_count": 3, "id": "ca64e293", "metadata": {}, "outputs": [], "source": ["class Station:\n", " def __init__(self, name, lat, lng):\n", " self.name = name\n", " self.lng = lng\n", " self.lat = lat\n", "\n", "station = Station(\"Charles Michels\", 48.846651, 2.285811)"]}, {"cell_type": "markdown", "id": "9bf88310", "metadata": {}, "source": ["Lorsqu'on \u00e9crit ce qui suit, l'autocompl\u00e9tion du notebook montre les diff\u00e9rentes possibilit\u00e9s."]}, {"cell_type": "code", "execution_count": 4, "id": "4fea076f", "metadata": {}, "outputs": [{"data": {"text/plain": ["'Charles Michels'"]}, "execution_count": 5, "metadata": {}, "output_type": "execute_result"}], "source": ["station.name"]}, {"cell_type": "markdown", "id": "ce328462", "metadata": {}, "source": ["Les classes permettent de d\u00e9finir de nouveau type de donn\u00e9es. Ici, une station, avec trois attributs, `name`, `lng`, `lat`."]}, {"cell_type": "markdown", "id": "1764eb4a", "metadata": {}, "source": ["## Une distance"]}, {"cell_type": "code", "execution_count": 5, "id": "c3f1dff0", "metadata": {}, "outputs": [{"data": {"text/plain": ["0.6928550943713419"]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["import math\n", "\n", "\n", "def distance_haversine(s1, s2):\n", " radius = 6371\n", " lat1 = s1['lat']\n", " lat2 = s2['lat']\n", " lng1 = s1['lng']\n", " lng2 = s2['lng']\n", " dlat = math.radians(lat2 - lat1)\n", " dlon = math.radians(lng2 - lng1)\n", " a = (math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) *\n", " math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2))\n", " c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))\n", " d = radius * c\n", " return d\n", "\n", "station1 = {'name': 'Charles Michels', 'lat': 48.846651, 'lng': 2.285811}\n", "station2 = {'name': 'Emile Zola', 'lat': 48.847030, 'lng': 2.295262}\n", "distance_haversine(station1, station2)"]}, {"cell_type": "markdown", "id": "8b4c80a1", "metadata": {}, "source": ["La m\u00eame \u00e9criture avec des classes."]}, {"cell_type": "code", "execution_count": 6, "id": "dba991cf", "metadata": {}, "outputs": [{"data": {"text/plain": ["0.6928550943713419"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["def distance_haversine(s1, s2):\n", " radius = 6371\n", " lat1 = s1.lat\n", " lat2 = s2.lat\n", " lng1 = s1.lng\n", " lng2 = s2.lng\n", " dlat = math.radians(lat2 - lat1)\n", " dlon = math.radians(lng2 - lng1)\n", " a = (math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) *\n", " math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2))\n", " c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))\n", " d = radius * c\n", " return d\n", "\n", "station1 = Station(\"Charles Michels\", 48.846651, 2.285811)\n", "station2 = Station(\"Emile Zola\", 48.847030, 2.295262)\n", "distance_haversine(station1, station2)"]}, {"cell_type": "markdown", "id": "813b7d15", "metadata": {}, "source": ["## M\u00e9thode\n", "\n", "Et comme cette fonction ne s'applique qu'aux stations de m\u00e9tro, on peut la d\u00e9finir en tant que fonction appartenant \u00e0 la classe ou **m\u00e9thode**."]}, {"cell_type": "code", "execution_count": 7, "id": "c9fc57e3", "metadata": {}, "outputs": [{"data": {"text/plain": ["0.6928550943713419"]}, "execution_count": 8, "metadata": {}, "output_type": "execute_result"}], "source": ["class Station:\n", " def __init__(self, name, lat, lng):\n", " self.name = name\n", " self.lng = lng\n", " self.lat = lat\n", " \n", " def distance_haversine(s1, s2):\n", " radius = 6371\n", " lat1 = s1.lat\n", " lat2 = s2.lat\n", " lng1 = s1.lng\n", " lng2 = s2.lng\n", " dlat = math.radians(lat2 - lat1)\n", " dlon = math.radians(lng2 - lng1)\n", " a = (math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) *\n", " math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2))\n", " c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))\n", " d = radius * c\n", " return d\n", " \n", "station1 = Station(\"Charles Michels\", 48.846651, 2.285811)\n", "station2 = Station(\"Emile Zola\", 48.847030, 2.295262)\n", "station1.distance_haversine(station2)"]}, {"cell_type": "markdown", "id": "825fd178", "metadata": {}, "source": ["Une m\u00e9thode de la classe `Station` prend toujours comme premier param\u00e8tre une variable de type `Station` (ou **instance**). On le distingue en l'appelant `self`. En python, c'est une convention, pas une obligation mais l'\u00e9criture est plus rigide dans d'autres langages."]}, {"cell_type": "code", "execution_count": 8, "id": "a05fefff", "metadata": {}, "outputs": [{"data": {"text/plain": ["0.6928550943713419"]}, "execution_count": 9, "metadata": {}, "output_type": "execute_result"}], "source": ["class Station:\n", " def __init__(self, name, lat, lng):\n", " self.name = name\n", " self.lng = lng\n", " self.lat = lat\n", " \n", " def distance_haversine(self, s2):\n", " radius = 6371\n", " lat1 = self.lat\n", " lat2 = s2.lat\n", " lng1 = self.lng\n", " lng2 = s2.lng\n", " dlat = math.radians(lat2 - lat1)\n", " dlon = math.radians(lng2 - lng1)\n", " a = (math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) *\n", " math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2))\n", " c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))\n", " d = radius * c\n", " return d\n", " \n", "station1 = Station(\"Charles Michels\", 48.846651, 2.285811)\n", "station2 = Station(\"Emile Zola\", 48.847030, 2.295262)\n", "station1.distance_haversine(station2)"]}, {"cell_type": "markdown", "id": "5a58cfdb", "metadata": {}, "source": ["Ca fait la m\u00eame chose mais cela s'\u00e9crit diff\u00e9remment."]}, {"cell_type": "markdown", "id": "cd49246a", "metadata": {}, "source": ["## Op\u00e9rateurs\n", "\n", "Les classes permettent \u00e9galement de d\u00e9finir des op\u00e9rations."]}, {"cell_type": "code", "execution_count": 9, "id": "3b063d2b", "metadata": {}, "outputs": [{"data": {"text/plain": ["0.6928550943713419"]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}], "source": ["class Station:\n", " def __init__(self, name, lat, lng):\n", " self.name = name\n", " self.lng = lng\n", " self.lat = lat\n", " \n", " def distance_haversine(self, s2):\n", " radius = 6371\n", " lat1 = self.lat\n", " lat2 = s2.lat\n", " lng1 = self.lng\n", " lng2 = s2.lng\n", " dlat = math.radians(lat2 - lat1)\n", " dlon = math.radians(lng2 - lng1)\n", " a = (math.sin(dlat / 2) * math.sin(dlat / 2) + math.cos(math.radians(lat1)) *\n", " math.cos(math.radians(lat2)) * math.sin(dlon / 2) * math.sin(dlon / 2))\n", " c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))\n", " d = radius * c\n", " return d\n", " \n", " def __rshift__(self, s2):\n", " return self.distance_haversine(s2)\n", " \n", "station1 = Station(\"Charles Michels\", 48.846651, 2.285811)\n", "station2 = Station(\"Emile Zola\", 48.847030, 2.295262)\n", "station1 >> station2"]}, {"cell_type": "code", "execution_count": 10, "id": "f91c7347", "metadata": {}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.5"}}, "nbformat": 4, "nbformat_minor": 5}