Aller au contenu

Les Attributs d'Objets en Python

Types d'Attributs

En Python, il existe différents types d'attributs qui peuvent être associés à un objet :

  • Attributs d'instance
  • Attributs de classe
  • Propriétés

1. Attributs d'Instance

Les attributs d'instance sont uniques à chaque instance de la classe.

Python
class Person:
    def __init__(self, name, age):
        self.name = name    # Instance attribute
        self.age = age    # Instance attribute

# Creating two instances
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)

print(person1.name)  # Alice
print(person2.name)  # Bob

2. Attributs de Classe

Les attributs de classe sont partagés par toutes les instances de la classe.

Python
class Counter:
    instance_count = 0  # Class attribute

    def __init__(self):
        Counter.instance_count += 1

# Creating instances
c1 = Counter()
c2 = Counter()

print(Counter.instance_count)  # 2
print(c1.instance_count)       # 2
print(c2.instance_count)       # 2

3. Propriétés

Les propriétés permettent de contrôler l'accès aux attributs avec des getters et setters.

Python
class Temperature:
    def __init__(self):
        self._celsius = 0

    @property
    def celsius(self):
        return self._celsius

    @celsius.setter
    def celsius(self, value):
        if value < -273.15:
            raise ValueError("Temperature cannot be below absolute zero")
        self._celsius = value

    @property
    def fahrenheit(self):
        return (self.celsius * 9/5) + 32

# Using properties
temp = Temperature()
temp.celsius = 25
print(f"{temp.celsius}°C = {temp.fahrenheit}°F")

Gestion des Attributs

1. Vérification d'Existence

Python offre plusieurs façons de vérifier l'existence d'attributs.

Python
# Vérification avec hasattr()
if hasattr(person1, 'name'):
    print("L'attribut 'name' existe")

# Vérification avec getattr()
age = getattr(person1, 'age', None)  # None si l'attribut n'existe pas

2. Attributs Privés

Le préfixe double underscore déclenche le name mangling : il réduit les collisions accidentelles dans les sous-classes, sans constituer un contrôle d'accès strict.

Python
class BankAccount:
    def __init__(self):
        self.__balance = 0  # Name-mangled attribute

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount

    def get_balance(self):
        return self.__balance

account = BankAccount()
account.deposit(100)
print(account.get_balance())  # 100
# print(account.__balance)  # AttributeError

Points Clés à Retenir

  • Les attributs d'instance sont uniques à chaque objet
  • Les attributs de classe sont partagés entre toutes les instances
  • Les propriétés permettent un contrôle fin de l'accès aux attributs
  • Les attributs privés offrent une encapsulation des données

Prochaines Étapes

  • Méthodes d'objets
  • Héritage et polymorphisme
  • Méthodes spéciales et protocoles