Données d'instance et de classe

Programmation orientée objet en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Principes clés de la POO

 

Héritage :

  • Étendre les fonctionnalités d'un code existant

Polymorphisme :

  • Offrir une interface unifiée

Encapsulation :

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

Données au niveau 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 est lié à une instance
Programmation orientée objet en Python

Données au niveau classe

  • Données partagées par toutes les instances d'une classe
  • Définir des attributs de classe dans le corps de class
class MyClass:
    # Define a class attribute
    CLASS_ATTR_NAME = attr_value


  • « Variable globale » à l'intérieur de la classe
Programmation orientée objet en Python

Données au niveau classe

class Employee:
  # Define a class attribute
  MIN_SALARY = 30000    #<--- no self. 

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

Données au niveau classe

class Employee:
  # Define a class attribute
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Use class name to access class attribute 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 des attributs
  • valeurs et constantes courantes, p. ex. 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 des données d'instance
class MyClass:

  @classmethod                         # <---use decorator to declare a class method

def my_awesome_method(cls, args...): # <---cls argument refers to the class # Do stuff here # Can't use any instance attributes :(
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
  • On 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)

  • Utilisez des méthodes de classe pour créer des objets
  • Utiliser return pour retourner 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...