Comment créer un objet immuable en Python

PythonPythonBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Python est un langage de programmation polyvalent qui offre une large gamme de fonctionnalités et d'outils, y compris la possibilité de créer des objets immuables. Dans ce tutoriel, nous allons explorer le concept d'objets immuables en Python, comment les définir et comment tirer parti de leurs avantages dans votre code.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python/BasicConceptsGroup -.-> python/variables_data_types("Variables and Data Types") python/BasicConceptsGroup -.-> python/numeric_types("Numeric Types") python/BasicConceptsGroup -.-> python/strings("Strings") python/BasicConceptsGroup -.-> python/booleans("Booleans") python/BasicConceptsGroup -.-> python/type_conversion("Type Conversion") subgraph Lab Skills python/variables_data_types -.-> lab-398168{{"Comment créer un objet immuable en Python"}} python/numeric_types -.-> lab-398168{{"Comment créer un objet immuable en Python"}} python/strings -.-> lab-398168{{"Comment créer un objet immuable en Python"}} python/booleans -.-> lab-398168{{"Comment créer un objet immuable en Python"}} python/type_conversion -.-> lab-398168{{"Comment créer un objet immuable en Python"}} end

Comprendre les objets immuables

En Python, les objets peuvent être classés en deux catégories principales : mutables et immuables. Les objets mutables sont ceux qui peuvent être modifiés après leur création, tandis que les objets immuables sont ceux qui ne peuvent pas être modifiés une fois créés.

Les objets immuables sont un concept fondamental en programmation Python, et il est crucial de les comprendre pour écrire un code efficace et fiable. Ces objets sont souvent utilisés dans les situations où vous devez vous assurer que les données qu'ils représentent restent inchangées tout au long de la durée de vie du programme.

Voici quelques exemples courants d'objets immuables en Python :

  • Nombres (entiers, flottants et nombres complexes)
  • Chaînes de caractères (strings)
  • Tuples
  • Ensembles gelés (frozen sets)

Ces objets présentent les caractéristiques suivantes :

  1. Inchangeables : Une fois qu'un objet immuable est créé, sa valeur ne peut pas être modifiée. Toute opération qui semble modifier l'objet crée en réalité un nouvel objet avec la valeur souhaitée.
  2. Sûrs pour les threads : Les objets immuables sont intrinsèquement sûrs pour les threads, ce qui signifie qu'ils peuvent être partagés en toute sécurité entre plusieurs threads sans risque de conditions de concurrence ou d'autres problèmes de concurrence.
  3. Efficaces : Les objets immuables sont généralement plus efficaces que les objets mutables, car ils peuvent être facilement partagés et copiés sans avoir besoin de créer de nouvelles copies des données.

Les objets immuables sont largement utilisés en Python, en particulier dans les situations où vous devez vous assurer de l'intégrité de vos données ou où vous devez transmettre des données entre des fonctions ou des modules sans risque de modifications non intentionnelles.

## Example of an immutable object (integer)
x = 42
print(id(x))  ## Output: 140707600090368
x = x + 1
print(id(x))  ## Output: 140707600090400

Dans l'exemple ci-dessus, lorsque nous ajoutons 1 à l'entier x, un nouvel objet entier avec la valeur 43 est créé, et la variable x est réaffectée à ce nouvel objet. L'objet original avec la valeur 42 n'est pas modifié.

Comprendre le concept d'objets immuables est essentiel pour écrire un code Python efficace et fiable. En exploitant les propriétés des objets immuables, vous pouvez garantir l'intégrité de vos données et simplifier votre code, ce qui conduit à des applications plus maintenables et robustes.

Définir des objets immuables en Python

Types intégrés immuables

En Python, plusieurs types intégrés sont intrinsèquement immuables, notamment :

  1. Nombres (entiers, flottants et nombres complexes)
  2. Chaînes de caractères (strings)
  3. Tuples
  4. Ensembles gelés (frozen sets)

Ces types ne peuvent pas être modifiés une fois créés. Toute opération qui semble modifier l'objet crée en réalité un nouvel objet avec la valeur souhaitée.

## Example: Immutable integer
x = 42
print(id(x))  ## Output: 140707600090368
x = x + 1
print(id(x))  ## Output: 140707600090400

Création d'objets immuables personnalisés

Alors que les types intégrés de Python fournissent un ensemble d'objets immuables, vous pouvez également créer vos propres objets immuables personnalisés en suivant ces directives :

  1. Utilisez l'attribut __slots__ : En définissant l'attribut __slots__ dans votre classe, vous pouvez limiter les attributs qui peuvent être ajoutés à une instance de la classe, rendant ainsi effectivement l'instance immuable.
class ImmutablePoint:
    __slots__ = ('x', 'y')

    def __init__(self, x, y):
        self.x = x
        self.y = y
  1. Évitez de modifier les attributs : Assurez-vous que votre classe ne fournit aucune méthode qui peut modifier l'état interne de l'objet.
  2. Utilisez le décorateur @property : Utilisez le décorateur @property pour créer des propriétés en lecture seule, ce qui peut aider à garantir l'immuabilité de votre objet.
class ImmutablePoint:
    def __init__(self, x, y):
        self._x = x
        self._y = y

    @property
    def x(self):
        return self._x

    @property
    def y(self):
        return self._y
  1. Implémentez la méthode __hash__ : Si vous souhaitez utiliser votre objet immuable comme clé dans un dictionnaire ou comme membre d'un ensemble, vous devriez implémenter la méthode __hash__ pour vous assurer que l'objet peut être haché.

En suivant ces directives, vous pouvez créer vos propres objets immuables personnalisés en Python, ce qui peut être utile dans diverses situations, par exemple lorsque vous devez garantir l'intégrité de vos données ou lorsque vous devez transmettre des données entre des fonctions ou des modules sans risque de modifications non intentionnelles.

Tirer parti des objets immuables

Les objets immuables en Python offrent plusieurs avantages qui les rendent précieux dans diverses situations de programmation. Explorons quelques-unes des principales façons dont vous pouvez tirer parti des objets immuables dans vos projets Python.

Amélioration des performances et de l'efficacité

Les objets immuables sont généralement plus efficaces que les objets mutables car ils peuvent être facilement partagés et copiés sans avoir besoin de créer de nouvelles copies des données. Cela peut entraîner une amélioration des performances, en particulier dans les scénarios où vous devez transmettre des données entre des fonctions ou des modules.

## Example: Efficient sharing of immutable objects
def process_data(data):
    ## Perform some operations on the data
    return data.upper()

data = "labex"
result = process_data(data)
print(result)  ## Output: LABEX

Concurrence et sécurité des threads

Les objets immuables sont intrinsèquement sûrs pour les threads, ce qui signifie qu'ils peuvent être partagés en toute sécurité entre plusieurs threads sans risque de conditions de concurrence ou d'autres problèmes de concurrence. Cela les rend particulièrement utiles dans les environnements de programmation concurrente, où vous devez garantir l'intégrité de vos données.

## Example: Immutable objects in a multi-threaded environment
import threading

def worker(data):
    ## Perform some operations on the data
    return data.upper()

data = "labex"
threads = []
for _ in range(10):
    t = threading.Thread(target=worker, args=(data,))
    t.start()
    threads.append(t)

for t in threads:
    t.join()

Mise en cache et mémoïsation

Les objets immuables peuvent être utilisés efficacement pour la mise en cache et la mémoïsation, où vous stockez les résultats de calculs coûteux ou d'appels d'API pour éviter de répéter le même travail. Étant donné que les objets immuables ne peuvent pas être modifiés, vous pouvez les mettre en cache en toute sécurité et réutiliser les résultats sans risque de modifications non intentionnelles.

## Example: Memoization using immutable objects
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)

## Memoize the fibonacci function
memo = {}
def memoized_fibonacci(n):
    if n in memo:
        return memo[n]
    result = fibonacci(n)
    memo[n] = result
    return result

print(memoized_fibonacci(100))  ## Output: 354224848179261915075

En exploitant les propriétés des objets immuables, vous pouvez écrire un code Python plus efficace, sûr pour les threads et facilement maintenable. Maîtriser l'utilisation des objets immuables est une compétence précieuse qui peut vous aider à devenir un programmeur Python plus compétent.

Résumé

Maîtriser les objets immuables en Python est une compétence précieuse pour tout développeur. En comprenant comment créer et utiliser des objets immuables, vous pouvez écrire un code plus efficace, fiable et sécurisé. Ce tutoriel a fourni une vue d'ensemble complète du sujet, couvrant les aspects clés des objets immuables en Python. Grâce aux connaissances acquises, vous pouvez désormais intégrer avec confiance des objets immuables dans vos projets Python et tirer parti de leurs propriétés uniques.