Descripteurs

Programmation orientée objet intermédiaire en Python

Jake Roach

Data Engineer

Modifier l'interaction avec les attributs

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn
# Create a student object, and access the "ssn" attribute
shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)

# What if the value is changed or deleted? How should this be handled?
193-80-1821
Programmation orientée objet intermédiaire en Python

Créer des descripteurs avec @property

Les descripteurs sont des objets qui régissent la façon de lire, d'écrire ou de supprimer un attribut

Créer des descripteurs avec @property

  • « getter », « setter », « deleter »
  • Noms des méthodes = nom de l'attribut.

On peut aussi créer des descripteurs avec…

  • fonction property()
  • __get__(), __set__(), __delete__()

$$

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn

    @property  
    def ssn(self):
        return "XXX-XX-" + self._ssn[-4:]

    @ssn.setter  
    def ssn(self, new_ssn):
        self._ssn = new_ssn 

    @ssn.deleter
    def ssn(self):
        raise AttributeError("Can't delete SSN")
Programmation orientée objet intermédiaire en Python

@property

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn  # Does not need to include an underscore

    @property  
    def ssn(self):  # This is the "getter" method
        return "XXX-XX-" + self._ssn[-4:]
  • Contrôle la récupération de ssn
  • Interagir avec self._ssn, pas self.ssn
Programmation orientée objet intermédiaire en Python

@ssn.setter

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn
    ...

    @ssn.setter  
    def ssn(self, new_ssn):
        if len(new_ssn) == 11:
          # Add things such as data 
          # validation, operations on
          # other attributes, etc.
          self._ssn = new_ssn

@<attribute-name>.setter

  • Méthode « setter » pour ssn
  • Valider la qualité des données
  • Effectuer des opérations sur d'autres attributs

$$

$$

$$

Rappelez-vous d'interagir avec self._ssn, pas self.ssn !

Programmation orientée objet intermédiaire en Python

@ssn.deleter

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn

    ...

    @ssn.deleter
    def ssn(self):
        # Can perform clean up, soft delete, raise exception
        raise AttributeError("Can't delete SSN")
Programmation orientée objet intermédiaire en Python

Descripteurs en action

shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)  # Access the ssn attribute
XXX-XX-1821
shaw.snn = "821-11-9380"  # Mettre à jour le numéro d'assurance sociale de Shaw
print(shaw.ssn)
XXX-XX-9380
del shaw.ssn  # Tentative de suppression de l'attribut ssn
AttributeError: Can't delete SSN
Programmation orientée objet intermédiaire en Python

Passons à la pratique !

Programmation orientée objet intermédiaire en Python

Preparing Video For Download...