Descriptors

Gevorderde objectgeoriënteerde programmering in Python

Jake Roach

Data Engineer

Interactie met attributen aanpassen

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn
# Maak een student en lees het "ssn"-attribuut uit
shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)

# Wat als de waarde wordt gewijzigd of verwijderd? Hoe ga je hiermee om?
193-80-1821
Gevorderde objectgeoriënteerde programmering in Python

Descriptors maken met @property

Descriptors zijn objecten die bepalen hoe een attribuut wordt opgehaald, gezet of verwijderd

Maak descriptors met @property

  • "getter", "setter", "deleter"
  • Methodenaam == attribuutnaam

Descriptors kun je ook maken met...

  • de functie 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")
Gevorderde objectgeoriënteerde programmering in Python

@property

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn  # Hoeft geen underscore te hebben

    @property  
    def ssn(self):  # Dit is de "getter"
        return "XXX-XX-" + self._ssn[-4:]
  • Bepaalt hoe ssn wordt opgehaald
  • Werk met self._ssn, niet met self.ssn
Gevorderde objectgeoriënteerde programmering in 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:
          # Voeg zaken toe zoals datavalidatie,
          # bewerkingen op andere attributen, enz.
          self._ssn = new_ssn

@<attribute-name>.setter

  • "setter"-methode voor ssn
  • Valideer datakwaliteit
  • Voer bewerkingen uit op andere attributen

$$

$$

$$

Onthoud: werk met self._ssn, niet met self.ssn!

Gevorderde objectgeoriënteerde programmering in 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")
Gevorderde objectgeoriënteerde programmering in Python

Descriptors in actie

shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)  # Access the ssn attribute
XXX-XX-1821
shaw.ssn = "821-11-9380"  # Update Shaw's social security number
print(shaw.ssn)
XXX-XX-9380
del shaw.ssn  # Attempt to delete the ssn attribute
AttributeError: Can't delete SSN
Gevorderde objectgeoriënteerde programmering in Python

Laten we oefenen!

Gevorderde objectgeoriënteerde programmering in Python

Preparing Video For Download...