Descritores

Programação Orientada a Objetos Intermediária em Python

Jake Roach

Data Engineer

Mudando interações com atributos

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn
# Crie um objeto student e acesse o atributo "ssn"
shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)

# E se o valor mudar ou for apagado? Como lidar com isso?
193-80-1821
Programação Orientada a Objetos Intermediária em Python

Criando descritores com @property

Descritores são objetos usados para regular como um atributo é lido, definido ou apagado

Crie descritores com @property

  • "getter", "setter", "deleter"
  • Nomes dos métodos == nome do atributo.

Descritores também podem ser criados com...

  • função 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")
Programação Orientada a Objetos Intermediária em Python

@property

class Student:
    def __init__(self, name, ssn):
        self.name = name
        self.ssn = ssn  # Não precisa ter sublinhado

    @property  
    def ssn(self):  # Este é o método "getter"
        return "XXX-XX-" + self._ssn[-4:]
  • Controla como ssn é lido
  • Interaja com self._ssn, não self.ssn
Programação Orientada a Objetos Intermediária em 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:
          # Adicione validações de dados,
          # operações em outros atributos, etc.
          self._ssn = new_ssn

@<attribute-name>.setter

  • Método "setter" para ssn
  • Validar a qualidade dos dados
  • Fazer operações em outros atributos

$$

$$

$$

Lembre-se de interagir com self._ssn, não self.ssn!

Programação Orientada a Objetos Intermediária em Python

@ssn.deleter

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

    ...

    @ssn.deleter
    def ssn(self):
        # Pode fazer limpeza, soft delete ou lançar exceção
        raise AttributeError("Can't delete SSN")
Programação Orientada a Objetos Intermediária em Python

Descritores em ação

shaw = Student("Daniel Shaw", "193-80-1821")
print(shaw.ssn)  # Acesse o atributo ssn
XXX-XX-1821
shaw.ssn = "821-11-9380"  # Atualize o número de SSN de Shaw
print(shaw.ssn)
XXX-XX-9380
del shaw.ssn  # Tente apagar o atributo ssn
AttributeError: Can't delete SSN
Programação Orientada a Objetos Intermediária em Python

Vamos praticar!

Programação Orientada a Objetos Intermediária em Python

Preparing Video For Download...