Propriétés

Programmation orientée objet en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Modifier les valeurs des attributs

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# Utiliser la syntaxe pointée et = pour modifier les attributs
emp.salary = emp.salary + 5000
Programmation orientée objet en Python

Modifier les valeurs des attributs

class Employee:
  def set_name(self, name):
    self.name = name 
  def set_salary(self, salary):
    self.salary = salary 
  def give_raise(self, amount):
    self.salary = self.salary + amount

def __init__(self, name, salary): self.name, self.salary = name, salary
emp = Employee("Miriam Azari", 35000)
# Utiliser la syntaxe pointée et = pour modifier les attributs
emp.salary = emp.salary + 5000

 

 

Contrôler l'accès aux attributs ?

  • vérifier la validité de la valeur
  • ou rendre les attributs en lecture seule
    • modifier set_salary() n'empêcherait pas emp.salary = -100
Programmation orientée objet en Python

Attributs restreints et en lecture seule

import pandas as pd
df = pd.DataFrame({"colA": [1,2], "colB":[3,4]})
df
  colA colB
0    1    3
1    2    4
df.columns = ["new_colA", "new_colB"]
df
  new_colA  new_colB
0    1    3
1    2    4
# provoquera une erreur
df.columns = ["new_colA", "new_colB", "extra"]
df
ValueError: Length mismatch: 
Expected axis has 2 elements, 
new values have 3 elements
df.shape = (43, 27)
df
AttributeError: can't set attribute
Programmation orientée objet en Python

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary):
if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary

 

← Utiliser un attribut "protégé" avec un _ pour stocker les données

← Utiliser @property sur une méthode dont le nom est exactement celui de l'attribut restreint ; retourner l'attribut interne

← Utiliser @attr.setter sur une méthode attr() appelée lors de obj.attr = value

  • la valeur à attribuer est passée en argument
Programmation orientée objet en Python

@property

class Employer:
  def __init__(self, name, new_salary):
     self._salary = new_salary


@property def salary(self): return self._salary
@salary.setter def salary(self, new_salary): if new_salary < 0: raise ValueError("Invalid salary") self._salary = new_salary
emp = Employee("Miriam Azari", 35000)
# accessing the "property"
emp.salary
35000
emp.salary = 60000 # <-- @salary.setter
emp.salary = -1000
ValueError: Invalid salary
Programmation orientée objet en Python

Pourquoi utiliser @property ?

  $$\text{\Large{Côté utilisateur : se comportent comme des attributs}}$$

 

$$\text{\Large{Côté développeur : contrôle de l'accès}}$$

Programmation orientée objet en Python

Autres possibilités

→ Ne pas ajouter @attr.setter

Créer une propriété en lecture seule

→ Ajouter @attr.getter

Utiliser pour la méthode appelée lors de la récupération de la valeur de la propriété

→ Ajouter @attr.deleter

Utiliser pour la méthode appelée lors de la suppression de la propriété avec del

Programmation orientée objet en Python

Passons à la pratique !

Programmation orientée objet en Python

Preparing Video For Download...