Données d'instance et de classe

Programmation orientée objet en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Principes fondamentaux de la POO

 

Héritage :

  • Étendre la fonctionnalité du code existant

Polymorphisme :

  • Créer une interface unifiée

Encapsulation :

  • Regrouper des données et des méthodes
Programmation orientée objet en Python

Données au niveau de l'instance

class Employee:
    def __init__(self, name, salary):
       self.name = name
       self.salary = salary

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • name, salary sont des attributs d'instance
  • self se lie à une instance
Programmation orientée objet en Python

Données au niveau de la classe

  • Données partagées entre toutes les instances d'une classe
  • Définir des attributs de classe dans le corps de class
class MyClass:
    # Définir un attribut de classe
    CLASS_ATTR_NAME = attr_value


  • "Variable globale" au sein de la classe
Programmation orientée objet en Python

Données au niveau de la classe

class Employee:
  # Définir un attribut de classe
  MIN_SALARY = 30000    #<--- pas de self. 

def __init__(self, name, salary): self.name = name # Utiliser le nom de la classe pour accéder à l'attribut de classe if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY est partagé entre toutes les instances
  • Ne pas utiliser self pour définir un attribut de classe
  • utiliser ClassName.ATTR_NAME pour accéder à la valeur de l'attribut de classe
Programmation orientée objet en Python

Données au niveau de la classe

class Employee:
  # Définir un attribut de classe
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Utiliser le nom de la classe pour accéder à l'attribut de classe if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
emp1 = Employee("TBD", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("TBD", 60000)
print(emp2.MIN_SALARY)
30000
Programmation orientée objet en Python

Pourquoi utiliser des attributs de classe ?

Constantes globales liées à la classe

 

  • valeurs minimales/maximales pour les attributs
  • valeurs et constantes couramment utilisées, par exemple pi pour une classe Circle
  • ...
Programmation orientée objet en Python

Méthodes de classe

  • Les méthodes sont déjà "partagées" : même code pour chaque instance
  • Les méthodes de classe ne peuvent pas utiliser les données au niveau de l'instance
class MyClass:

  @classmethod                         # <---utiliser un décorateur pour déclarer une méthode de classe

def my_awesome_method(cls, args...): # <---l'argument cls se réfère à la classe # Faire des choses ici # Ne peut pas utiliser d'attributs d'instance :(
MyClass.my_awesome_method(args...)
Programmation orientée objet en Python

Constructeurs alternatifs

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY
  • Ne peut avoir qu'un seul __init__()

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)

  • Utiliser des méthodes de classe pour créer des objets
  • Utiliser return pour renvoyer un objet
  • cls(...) appellera __init__(...)
Programmation orientée objet en Python

Constructeurs alternatifs

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)        

fichier texte contenant une ligne avec le nom de l'employé

# Créer un employé sans appeler Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Programmation orientée objet en Python

Passons à la pratique !

Programmation orientée objet en Python

Preparing Video For Download...