Descrittori

Programmazione a oggetti intermedia in Python

Jake Roach

Data Engineer

Modificare l'interazione con gli attributi

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn
# Crea un oggetto student e accedi all'attributo "ssn"
shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)

# E se il valore cambia o viene eliminato? Come gestirlo?
193-80-1821
Programmazione a oggetti intermedia in Python

Creare descrittori con @property

I descrittori sono oggetti usati per regolare come un attributo viene letto, impostato o eliminato

Crea descrittori con @property

  • "getter", "setter", "deleter"
  • Nomi dei metodi = nome dell'attributo.

Si possono creare descrittori anche con…

  • funzione 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")
Programmazione a oggetti intermedia in Python

@property

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn  # Non serve il trattino basso

    @property  
    def ssn(self):  # Questo è il metodo "getter"
        return "XXX-XX-" + self._ssn[-4:]
  • Controlla come si legge ssn
  • Interagisci con self._ssn, non con self.ssn
Programmazione a oggetti intermedia 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:
          # Aggiungi elementi come convalida dei dati 
          # operazioni su altri attributi, ecc.
          self._ssn = new_ssn

@<attribute-name>.setter

  • Metodo "setter" per ssn
  • Valida la qualità dei dati
  • Esegui operazioni su altri attributi

$$

$$

$$

Ricorda: interagisci con self._ssn, non con self.ssn!

Programmazione a oggetti intermedia in Python

@ssn.deleter

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

    ...

    @ssn.deleter
    def ssn(self):
        # Puoi fare clean up, soft delete, o sollevare un'eccezione
        raise AttributeError("Can't delete SSN")
Programmazione a oggetti intermedia in Python

Descrittori in azione

shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)  # Accedi all'attributo ssn
XXX-XX-1821
shaw.ssn = "821-11-9380"  # Aggiorna il numero di previdenza sociale di Shaw
print(shaw.ssn)
XXX-XX-9380
del shaw.ssn  # Prova a eliminare l'attributo ssn
AttributeError: Can't delete SSN
Programmazione a oggetti intermedia in Python

Esercitiamoci!

Programmazione a oggetti intermedia in Python

Preparing Video For Download...