{"id":5789,"date":"2024-08-29T06:00:29","date_gmt":"2024-08-29T06:00:29","guid":{"rendered":"https:\/\/wikiform.fr\/codespace\/concepts-et-utilisation-de-l-heritage-en-python\/"},"modified":"2024-08-29T06:00:32","modified_gmt":"2024-08-29T06:00:32","slug":"concepts-et-utilisation-de-l-heritage-en-python","status":"publish","type":"post","link":"https:\/\/wikiform.fr\/codespace\/concepts-et-utilisation-de-l-heritage-en-python\/","title":{"rendered":"5.8 Concepts et Utilisation de l&rsquo;H\u00e9ritage en Python"},"content":{"rendered":"\n<p><strong>Concepts et Utilisation de l&rsquo;H\u00e9ritage en Python<\/strong> permettent de cr\u00e9er des hi\u00e9rarchies de classes et de r\u00e9utiliser le code de mani\u00e8re efficace. Maitriser l&rsquo;h\u00e9ritage en Python est essentiel pour les d\u00e9veloppeurs qui souhaitent concevoir des logiciels modulaires et \u00e9volutifs. Apprenons \u00e0 exploiter l&rsquo;h\u00e9ritage avec des exemples concrets de code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction \u00e0 l&rsquo;H\u00e9ritage en Python<\/h2>\n\n\n\n<div id=\"videoContainer\" style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; background: #000;\">\n  <iframe src=\"https:\/\/player.vimeo.com\/video\/583361314?dnt=1&#038;fullscreen=0&#038;pip=0\" loading=\"lazy\" loading=\"lazy\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%;\" frameborder=\"0\" allow=\"autoplay\" allowfullscreen id=\"vimeoPlayer\"><\/iframe>\n  \n  <!-- Popup Desktop -->\n  <div id=\"popupContainer\" class=\"desktop-popup\" style=\"display: none; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 90%; max-width: 400px; padding: 20px; border-radius: 10px; text-align: center; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); background-color: rgba(255, 255, 255, 0.95); box-sizing: border-box;\">\n    <h2 style=\"color: #333; font-size: 1.5em; margin: 10px 0;\" id=\"profitez-de-loffre-spciale-\">Profitez de l\u2019offre sp\u00e9ciale !<\/h2>\n    <p style=\"color: #e74c3c; font-size: 1.2em; margin: 10px 0;\">Obtenez notre cours pour seulement <strong id=\"price\">29.5\u20ac<\/strong> au lieu de <del>59\u20ac<\/del> !<\/p>\n    <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" style=\"display: block; padding: 10px 20px; background-color: #701CF5; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 1em; margin: 20px auto;\" rel=\"noopener\">Commencer maintenant<\/a>\n    <button onclick=\"closePopup()\" style=\"padding: 10px 20px; font-size: 1em;\">Fermer<\/button>\n  <\/div>\n\n  <!-- Popup Mobile -->\n  <div id=\"popupContainerMobile\" class=\"mobile-popup\" style=\"display: none; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 80%; max-width: 300px; padding: 15px; border-radius: 10px; text-align: center; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); background-color: rgba(255, 255, 255, 0.95); box-sizing: border-box;\">\n    <p style=\"color: #e74c3c; font-size: 1em; margin: 5px 0;\">Cours sp\u00e9cial \u00e0 <strong id=\"priceMobile\">29.5\u20ac<\/strong> au lieu de <del>59\u20ac<\/del> !<\/p>\n    <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" style=\"display: inline-block; padding: 8px 15px; background-color: #701CF5; color: #fff; text-decoration: none; border-radius: 5px; font-weight: bold; font-size: 0.9em;\" rel=\"noopener\">Commencer maintenant<\/a>\n    <button onclick=\"closePopup()\" style=\"padding: 5px 10px; font-size: 0.9em;\">Fermer<\/button>\n  <\/div>\n<\/div>\n\n<script src=\"https:\/\/player.vimeo.com\/api\/player.js\"><\/script>\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    var iframe = document.getElementById('vimeoPlayer');\n    var player = new Vimeo.Player(iframe);\n    var isPopupDisplayed = false;\n\n    player.on('play', function() {\n        if (!isPopupDisplayed) {\n            player.on('timeupdate', function(data) {\n                if (data.seconds >= 120 && !isPopupDisplayed) { \/\/ 120 seconds = 2 minutes\n                    \/\/ Pause the video and display the popup\n                    player.pause().then(function() {\n                        if (window.innerWidth > 768) {\n                            document.querySelector('.desktop-popup').style.display = 'block';\n                        } else {\n                            document.querySelector('.mobile-popup').style.display = 'block';\n                        }\n                        fetchPriceAndUpdatePopup();\n                        isPopupDisplayed = true;\n                    });\n                }\n            });\n        }\n    });\n\n    function fetchPriceAndUpdatePopup() {\n        fetch('https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144')\n            .then(response => response.text())\n            .then(html => {\n                var parser = new DOMParser();\n                var fetchedDoc = parser.parseFromString(html, 'text\/html');\n                var priceElement = fetchedDoc.querySelector('.ammount .fw-500');\n                var originalPriceElement = fetchedDoc.querySelector('.ammount del');\n                var price = priceElement ? priceElement.textContent.trim() : '29.5\u20ac';\n                var originalPrice = originalPriceElement ? originalPriceElement.textContent.trim() : '59\u20ac';\n\n                document.getElementById('price').textContent = price;\n                document.getElementById('priceMobile').textContent = price;\n                document.querySelector('.desktop-popup del').textContent = originalPrice;\n                document.querySelector('.mobile-popup del').textContent = originalPrice;\n            })\n            .catch(error => console.error('Error fetching the price:', error));\n    }\n\n    function closePopup() {\n        document.querySelector('.desktop-popup').style.display = 'none';\n        document.querySelector('.mobile-popup').style.display = 'none';\n        player.play(); \/\/ Allows resuming the video only after closing the popup\n    }\n});\n<\/script>\n\n\n\n<p>En Python, l&rsquo;h\u00e9ritage est un puissant m\u00e9canisme qui permet aux nouvelles classes de tirer parti des fonctionnalit\u00e9s des classes existantes. Une classe qui d\u00e9rive d&rsquo;une autre classe s&rsquo;appelle une classe d\u00e9riv\u00e9e (ou sous-classe), et la classe \u00e0 partir de laquelle elle est d\u00e9riv\u00e9e s&rsquo;appelle une classe de base. Cette fonctionnalit\u00e9 est extr\u00eamement utile pour organiser et structurer le code de mani\u00e8re logique et r\u00e9utilisable.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er une Classe de Base<\/h3>\n\n\n\n<p>Pour commencer, cr\u00e9ons une classe de base simple. Cette classe encapsule des propri\u00e9t\u00e9s et des m\u00e9thodes communes que d&rsquo;autres classes pourront h\u00e9riter :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Animal:\n    def __init__(self, name, species):\n        self.name = name\n        self.species = species\n\n    def make_sound(self):\n        return f\"{self.name} fait bruit!\"\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cr\u00e9er une Classe D\u00e9riv\u00e9e en Utilisant l&rsquo;H\u00e9ritage<\/h3>\n\n\n\n<p>Une fois la classe de base d\u00e9finie, nous pouvons cr\u00e9er une classe d\u00e9riv\u00e9e qui h\u00e9ritera des propri\u00e9t\u00e9s et m\u00e9thodes de la classe de base. Voici un exemple :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Dog(Animal):\n    def __init__(self, name, breed):\n        super().__init__(name, 'Dog')\n        self.breed = breed\n\n    def make_sound(self):\n        return f\"{self.name} aboie!\"\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Utilisation de l&rsquo;H\u00e9ritage pour \u00c9tendre les Fonctionnalit\u00e9s<\/h3>\n\n\n\n<p>Voyons maintenant comment l&rsquo;h\u00e9ritage permet d&rsquo;\u00e9tendre les fonctionnalit\u00e9s d&rsquo;une classe de base tout en conservant un code propre et r\u00e9utilisable :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Cat(Animal):\n    def __init__(self, name, color):\n        super().__init__(name, 'Cat')\n        self.color = color\n\n    def make_sound(self):\n        return f\"{self.name} miaule!\"\n\n    def hunt(self):\n        return f\"{self.name}, le {self.color} chat, chasse les souris.\"\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Les M\u00e9thodes Sp\u00e9ciales et l&rsquo;H\u00e9ritage<\/h3>\n\n\n\n<p>Les m\u00e9thodes sp\u00e9ciales comme <code>__str__<\/code> ou <code>__len__<\/code> peuvent \u00e9galement \u00eatre h\u00e9rit\u00e9es et surcharg\u00e9es pour personnaliser le comportement des objets d\u00e9riv\u00e9s :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Bird(Animal):\n    def __init__(self, name, wingspan):\n        super().__init__(name, 'Bird')\n        self.wingspan = wingspan\n\n    def make_sound(self):\n        return f\"{self.name} chante!\"\n\n    def __str__(self):\n        return f\"{self.name} est un {self.species} avec une envergure de {self.wingspan} cm.\"\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Les Propri\u00e9t\u00e9s et les M\u00e9thodes Prot\u00e9g\u00e9es<\/h3>\n\n\n\n<p>Il est possible d&rsquo;avoir des propri\u00e9t\u00e9s et des m\u00e9thodes prot\u00e9g\u00e9es (c&rsquo;est-\u00e0-dire celles que l&rsquo;on ne souhaite pas rendre accessibles directement en dehors de la classe ou de ses sous-classes). Python utilise une seule barre de soulignement pour indiquer qu&rsquo;un attribut est prot\u00e9g\u00e9 :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Fish(Animal):\n    def __init__(self, name, habitat):\n        super().__init__(name, 'Fish')\n        self._habitat = habitat\n\n    def _swim(self):\n        return f\"{self.name} nage dans {self._habitat}.\"\n    \n    def make_sound(self):\n        return f\"{self.name} est silencieux!\"\n\n    def swim(self):\n        return self._swim()\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">La Fonction <code>super()<\/code> en D\u00e9tail<\/h3>\n\n\n\n<p>La fonction <code>super()<\/code> est utilis\u00e9e pour appeler une m\u00e9thode de la classe de base \u00e0 partir d&rsquo;une classe d\u00e9riv\u00e9e. Cela permet de r\u00e9utiliser le code de la classe de base et de le compl\u00e9ter si besoin :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Lion(Animal):\n    def __init__(self, name, is_wild):\n        super().__().__init(name, 'Lion')\n        self.is_wild = is_wild\n\n    def make_sound(self):\n        base_sound = super().make_sound()\n        return base_sound.replace('bruit', 'rugissement') + \\\n               (\" sauvage\" if self.is_wild else \"\")\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Utiliser Multiple Inheritance<\/h3>\n\n\n\n<p>Python permet la cr\u00e9ation de classes avec une h\u00e9ritage multiple. Bien que puissant, cette technique doit \u00eatre utilis\u00e9e avec prudence pour \u00e9viter les complexit\u00e9s. Voici un exemple simple :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class CanFly:\n    def fly(self):\n        return \"Je peux voler!\"\n\nclass CanSwim:\n    def swim(self):\n        return \"Je peux nager!\"\n\nclass Duck(Animal, CanFly, CanSwim):\n    def __init__(self, name):\n        super().__init__(name, 'Duck')\n\n    def make_sound(self):\n        return f\"{self.name} cancanne!\"\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Exemples Avanc\u00e9s d&rsquo;utilisation de l&rsquo;H\u00e9ritage en Python<\/h3>\n\n\n\n<p>Pour illustrer davantage les usages de l&rsquo;h\u00e9ritage, nous allons explorer quelques exemples avanc\u00e9s.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Gestion d&rsquo;\u00c9v\u00e9nements Asynchrones<\/h4>\n\n\n\n<p>Imaginez une application o\u00f9 diff\u00e9rents types d&rsquo;\u00e9v\u00e9nements doivent \u00eatre trait\u00e9s de mani\u00e8re sp\u00e9cifique tout en partageant une structure commune :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Event:\n    def __init__(self, time, description):\n        self.time = time\n        self.description = description\n\n    def __str__(self):\n        return f\"{self.time}: {self.description}\"\n\nclass ClickEvent(Event):\n    def __init__(self, time, x, y):\n        super().__init__(time, \"Click Event\")\n        self.x = x\n        self.y = y\n\n    def __str__(self):\n        base_str = super().__str__()\n        return f\"{base_str} at ({self.x}, {self.y})\"\n\nclass KeyboardEvent(Event):\n    def __init__(self, time, key):\n        super().__init__(time, \"Keyboard Event\")\n        self.key = key\n\n    def __str__(self):\n        base_str = super().__str__()\n        return f\"{base_str} for key {self.key}\"\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Application Pratique : Syst\u00e8mes de Gestion de Contenu<\/h4>\n\n\n\n<p>Dans un syst\u00e8me de gestion de contenu, les diff\u00e9rents types de contenus peuvent h\u00e9riter d&rsquo;une classe de base <code>Content<\/code>, simplifiant ainsi leur gestion :<\/p>\n\n\n\n<pre class=\"wp-block-code lang-python\"><code>class Content:\n    def __init__(self, title, body):\n        self.title = title\n        self.body = body\n\n    def summary(self):\n        return self.body[:100] + \"...\"\n\nclass Article(Content):\n    def __init__(self, title, body, author):\n        super().__init__(title, body)\n        self.author = author\n\n    def __str__(self):\n        return f\"Article by {self.author}: {self.title}\"\n\nclass BlogPost(Content):\n    def __init__(self, title, body, published_date):\n        super().__init__(title, body)\n        self.published_date = published_date\n\n    def __str__(self):\n        return f\"Blog Post on {self.published_date}: {self.title}\"\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion sur l&rsquo;H\u00e9ritage Python<\/h2>\n\n\n\n<p>L&rsquo;h\u00e9ritage en Python est une technique incontournable pour les d\u00e9veloppeurs souhaitant structurer leur code de mani\u00e8re claire, r\u00e9utilisable et \u00e9volutive. En comprenant les concepts de classes de base, de classes d\u00e9riv\u00e9es et de la fonction <code>super()<\/code>, vous pourrez efficacement appliquer l&rsquo;h\u00e9ritage dans vos projets. Pour en savoir plus sur la programmation orient\u00e9e objet en Python, explorez notre <a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\">formation compl\u00e8te pour devenir d\u00e9veloppeur Python<\/a>.<\/p>\n\n\n\n<a href=\"https:\/\/wikiform.fr\/application\/learnify\/home\/course\/devenir-un-d%C3%A9veloppeur-python\/144\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"https:\/\/wikiform.fr\/codespace\/wp-content\/uploads\/2024\/07\/learnify-formation-PYTHON-offre-50.gif\" loading=\"lazy\" alt=\"Learnify Formation Python Offre 50%\" title=\"\"><\/a>\n","protected":false},"excerpt":{"rendered":"<p>Concepts et Utilisation de l&rsquo;H\u00e9ritage en Python permettent de cr\u00e9er des hi\u00e9rarchies de classes et de r\u00e9utiliser le code de mani\u00e8re efficace. Maitriser l&rsquo;h\u00e9ritage en&#8230;<\/p>\n","protected":false},"author":4,"featured_media":2902,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[24],"tags":[18],"class_list":["post-5789","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","tag-tutoriels"],"acf":[],"_titre_de_la_formation":null,"_description_":null,"_objectifs_pedagogiques":null,"_programme_":null,"_url_de_limage":null,"_materiel_necessaire":null,"_modalites_devaluation_des_acquis":null,"_moyens_pedagogiques_et_techniques":null,"_accessibilite_":null,"_formateur_":null,"menu_order":0,"_links":{"self":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/comments?post=5789"}],"version-history":[{"count":1,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5789\/revisions"}],"predecessor-version":[{"id":5790,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/posts\/5789\/revisions\/5790"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media\/2902"}],"wp:attachment":[{"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/media?parent=5789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/categories?post=5789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wikiform.fr\/codespace\/wp-json\/wp\/v2\/tags?post=5789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}