Une classe abstraite est une classe, mais pas une à partir de laquelle vous pouvez créer des objets directement. Son but est de définir à quoi les autres classes devraient ressembler, c'est-à-dire quelles méthodes et propriétés elles sont censées avoir.
Les méthodes et propriétés définies (mais non implémentées) dans une classe abstraite sont appelées méthodes abstraites et propriétés abstraites . Toutes les méthodes et propriétés abstraites doivent être implémentées dans une classe enfant afin de pouvoir créer des objets à partir de celle-ci.
Nous pouvons créer une classe abstraite en héritant de la ABCclasse qui fait partie du abcmodule .
from abc import (
ABC,
abstractmethod,
)
class BasicPokemon(ABC):
def __init__(self, name):
self.name = name
self._level = 1
@abstractmethod
def main_attack(self):
...
Que se passe-t-il si vous essayez de créer un objet BasicPokemondirectement ? TypeError!
Maintenant, vous remarquerez que BasicPokemonla __init__méthode attend un nameargument , donc le code ci-dessus n'aura pas fonctionné de toute façon. La chose à noter ici est qu'il ne va même pas à la __init__méthode pour vérifier cela. Le fait qu'il ait une méthode abstraite qui n'a pas été implémentée est prioritaire et il échoue à cause de cela !
C'est ainsi que l'on utiliserait la BasicPokemonclasse.
from collections import namedtuple
Attack = namedtuple('Attack', ('name', 'damage'))
class Pikachu(BasicPokemon):
def main_attack(self):
return Attack('Thunder Shock', 5)
class Charmander(BasicPokemon):
def main_attack(self):
return Attack('Flame Thrower', 5)
Notez que vous pouvez également créer des propriétés abstraites en utilisant le même abstractmethoddécorateur.
from abc import (
ABC,
abstractmethod,
)
class BasicPokemon(ABC):
def __init__(self, name):
self.name = name
@property
@abstractmethod
def level(self):
...
@abstractmethod
def main_attack(self):
...
class Pikachu(BasicPokemon):
@property
def level(self):
return 1
def main_attack(self):
return Attack('Thunder Shock', 5)
Certains d'entre vous se demandent peut-être pourquoi nous ne pouvons pas simplement utiliser une classe normale (c'est-à-dire ne pas hériter de ABC) et lever un NotImplementerErrorpour les méthodes qui n'ont pas été implémentées, comme dans l'exemple ci-dessous.
class NotAbstractBasicPokemon:
def __init__(self, name):
self.name = name
self._level = 1
def main_attack(self):
raise NotImplementedError()
En revanche, essayer de créer un objet à partir de BasicPokemongénère immédiatement une erreur, comme nous l'avons vu précédemment.
Dans l'exemple que nous avons utilisé dans cet article, BasicPokemonle but de était d'être utilisé comme modèle pour créer d'autres classes pour des types spécifiques de Pokémon. Il y a quelques avantages évidents à avoir une classe abstraite dont tout le monde doit hériter pour créer un nouveau Pokémon :
Dans cet article, nous avons examiné les classes abstraites de Python et comment elles nous permettent de décrire comment nous nous attendons à ce que les sous-classes soient implémentées et avertissent les utilisateurs (c'est-à-dire d'autres programmeurs ou nous-mêmes futurs) lorsque des parties critiques ne sont pas définies.
[1]https://docs.python.org/3/library/abc.html
[2]https://realpython.com/python-interface/
Plus du même auteur.
Calcul de à l'aide de simulations de Monte-Carlo
Lorsque vous faites une demande à facebook.com, votre ordinateur recherche le nom de domaine pour traduire ce nom de domaine en une adresse IP afin que votre ordinateur puisse établir cette connexion.
Vous devez avoir entendu parler de tous les nouveaux plugins ChatGPT puissants comme le navigateur, l'interpréteur de code, etc. Mais il y a un problème, l'accès aux plugins est limité à une liste d'attente et donc beaucoup n'y ont pas accès.
Dans le monde rapide et compétitif d'aujourd'hui, la carrière d'une personne joue un rôle important dans la croissance personnelle, la stabilité financière et la satisfaction globale de la vie. Cependant, de nombreuses personnes se retrouvent prises dans un cycle incessant de stagnation et d'insatisfaction, dépérissant progressivement dans leur vie professionnelle.
La semaine dernière, j'ai remarqué un communiqué de presse, envoyé via PressGazette (un site Web d'information britannique). L'article annonçait qu'Acast, la société d'hébergement et de publicité de podcasts de Scandi, dirigerait un consortium d'éditeurs "probablement les plus influents" du podcasting.
Ça me frappe tout à coup, comme c'est si souvent le cas C'est à nouveau le milieu du chemin <Non, pas celui du Pacifique, toi marron, celui du carnaval> Chaque gros titre fort… ..
Introduction :Bienvenue, courageux lecteurs, dans un voyage qui nous emmènera dans les profondeurs les plus sombres de notre planète. Dans ce blog, nous plongeons dans le monde énigmatique de la fosse des Mariannes, découvrant ses secrets cachés et découvrant les vérités effrayantes qui se cachent sous sa surface.