Python - Réflexion

Bonjour à tous, futurs sorciers Python !aujourd'hui, nous allons entamer un voyage passionnant dans le monde magique de la réflexion Python. Ne vous inquiétez pas si vous n'avez jamais entendu parler de réflexion avant - à la fin de ce tutoriel, vous serez des professionnels de la réflexion ! Alors, prenez vos baguettes (je veux dire, vos claviers), et plongeons-y !

Python - Reflection

Qu'est-ce que la réflexion ?

Avant de commencer, comprenons ce qu'est la réflexion. En programmation, la réflexion est comme avoir un miroir qui permet à un programme d'examiner, d'introspecter et de modifier sa propre structure et comportement à l'exécution. C'est comme donner à votre code la capacité de se regarder et de dire, "Eh, de quoi suis-je fait ?" Très cool, non ?

La fonction type()

Commençons par la fonction type(). C'est comme demander à un objet, "Qu'est-ce que tu es ?"

# Exemple 1 : Utilisation de type()
x = 5
y = "Bonjour"
z = [1, 2, 3]

print(type(x))  # Sortie : <class 'int'>
print(type(y))  # Sortie : <class 'str'>
print(type(z))  # Sortie : <class 'list'>

Dans cet exemple, nous demandons à différentes variables ce qu'elles sont. La fonction type() nous informe que x est un entier, y est une chaîne de caractères et z est une liste. C'est comme avoir une conversation avec vos variables !

La fonction isinstance()

Ensuite, la fonction isinstance(). Cette fonction est comme demander, "Es-tu un membre de cette famille ?"

# Exemple 2 : Utilisation de isinstance()
x = 5
y = "Bonjour"

print(isinstance(x, int))    # Sortie : True
print(isinstance(y, str))    # Sortie : True
print(isinstance(x, str))    # Sortie : False

Ici, nous vérifions si x est une instance de int (ce qu'il est), si y est une instance de str (ce qu'il est), et si x est une instance de str (ce qu'il n'est pas). C'est comme demander à quelqu'un s'il est membre d'un club particulier !

La fonction issubclass()

Passons à issubclass(). C'est comme demander, "Es-tu lié à cette famille ?"

# Exemple 3 : Utilisation de issubclass()
class Animal:
pass

class Chien(Animal):
pass

print(issubclass(Chien, Animal))  # Sortie : True
print(issubclass(Animal, Chien))  # Sortie : False

Dans cet exemple, nous vérifions si Chien est une sous-classe de Animal (ce qu'il est), et si Animal est une sous-classe de Chien (ce qu'il n'est pas). C'est comme demander si un caniche est un type de chien, contre demander si tous les chiens sont des caniches !

La fonction callable()

Maintenant, parlons de callable(). Cette fonction vérifie si un objet peut être appelé (comme une fonction).

# Exemple 4 : Utilisation de callable()
def saluer():
print("Bonjour !")

x = 5

print(callable(saluer))  # Sortie : True
print(callable(x))      # Sortie : False

Ici, nous vérifions si saluer (qui est une fonction) est callable, et si x (qui n'est qu'un nombre) est callable. C'est comme demander, "Peut-on m'utiliser comme une fonction ?"

La fonction getattr()

getattr() est comme une manière polie de demander à un objet l'un de ses attributs.

# Exemple 5 : Utilisation de getattr()
class Personne:
nom = "Alice"
age = 30

p = Personne()
print(getattr(p, "nom"))  # Sortie : Alice
print(getattr(p, "emploi", "Chômeur"))  # Sortie : Chômeur

Dans cet exemple, nous demandons à notre objet Personne son attribut nom, qu'il a. Nous demandons également un attribut emploi, qu'il n'a pas, donc nous fournissons une valeur par défaut de "Chômeur".

La fonction setattr()

setattr() est comme donner un nouvel attribut à un objet ou modifier un attribut existant.

# Exemple 6 : Utilisation de setattr()
class Voiture:
couleur = "rouge"

ma_voiture = Voiture()
print(ma_voiture.couleur)  # Sortie : rouge

setattr(ma_voiture, "couleur", "bleu")
print(ma_voiture.couleur)  # Sortie : bleu

setattr(ma_voiture, "marque", "Toyota")
print(ma_voiture.marque)  # Sortie : Toyota

Ici, nous changeons la couleur de notre voiture de rouge à bleu, puis nous lui donnons un nouveau attribut marque.

La fonction hasattr()

hasattr() est comme demander à un objet, "As-tu cet attribut ?"

# Exemple 7 : Utilisation de hasattr()
class Livre:
titre = "Python pour Débutants"
pages = 200

mon_livre = Livre()
print(hasattr(mon_livre, "titre"))   # Sortie : True
print(hasattr(mon_livre, "auteur"))  # Sortie : False

Dans cet exemple, nous vérifions si notre objet Livre a un attribut titre (lequel il a) et un attribut auteur (lequel il n'a pas).

La fonction dir()

Enfin, examinons dir(). Cette fonction est comme demander à un objet, "Qu'est-ce que tu peux faire ?"

# Exemple 8 : Utilisation de dir()
class Chien:
def __init__(self, nom):
self.nom = nom

def aboyer(self):
print("Woof !")

mon_chien = Chien("Buddy")
print(dir(mon_chien))

Cela affichera une liste de tous les attributs et méthodes de notre objet Chien, y compris nom et aboyer, ainsi que certains attributs intégrés que tous les objets ont.

Résumé des fonctions de réflexion

Voici un résumé rapide de toutes les fonctions de réflexion que nous avons couvertes :

Fonction But
type() Retourne le type d'un objet
isinstance() Vérifie si un objet est une instance d'une classe spécifiée
issubclass() Vérifie si une classe est une sous-classe d'une autre classe
callable() Vérifie si un objet est callable (comme une fonction)
getattr() Obtient la valeur d'un attribut d'un objet
setattr() Définit la valeur d'un attribut d'un objet
hasattr() Vérifie si un objet a un attribut spécifique
dir() Retourne une liste des attributs et des méthodes d'un objet

Et voilà, mes amis ! Vous venez de faire vos premiers pas dans le monde de la réflexion Python. Souvenez-vous, ces outils sont comme avoir une conversation avec votre code. Ils permettent à vos programmes d'examiner eux-mêmes et de prendre des décisions basées sur ce qu'ils trouvent. C'est une fonctionnalité puissante qui peut rendre votre code plus flexible et dynamique.

À medida que vous continuez votre voyage Python, vous trouverez de nombreuses autres façons d'utiliser la réflexion pour créer des programmes plus intelligents et plus adaptables. Continuez à pratiquer, à explorer, et surtout, à vous amuser avec Python !

Credits: Image by storyset