Propriedades

Programação orientada a objetos em Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Alterando valores de atributos

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)
# Use a sintaxe de ponto e = para alterar atributos
emp.salary = emp.salary + 5000
Programação orientada a objetos em Python

Alterando valores de atributos

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)
# Use a sintaxe de ponto e = para alterar atributos
emp.salary = emp.salary + 5000

 

 

Controlar acesso a atributos?

  • verificar a validade do valor
  • ou tornar atributos somente leitura
    • modificar set_salary() não impediria emp.salary = -100
Programação orientada a objetos em Python

Atributos restritos e somente leitura

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
# causará um erro
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
Programação orientada a objetos em 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("Salário inválido") self._salary = new_salary

 

← Use atributo "protegido" com _ no início para armazenar dados

← Use @property em um método cujo nome é exatamente o nome do atributo restrito; retorne o atributo interno

← Use @attr.setter em um método attr() que será chamado em obj.attr = valor

  • o valor a ser atribuído é passado como argumento
Programação orientada a objetos em 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("Salário inválido") self._salary = new_salary
emp = Employee("Miriam Azari", 35000)
# acessando a "propriedade"
emp.salary
35000
emp.salary = 60000 # <-- @salary.setter
emp.salary = -1000
ValueError: Salário inválido
Programação orientada a objetos em Python

Por que usar @property?

  $$\text{\Large{Para o usuário: se comportam como atributos}}$$

 

$$\text{\Large{Para o desenvolvedor: controle de acesso}}$$

Programação orientada a objetos em Python

Outras possibilidades

→ Não adicione @attr.setter

Crie uma propriedade somente leitura

→ Adicione @attr.getter

Use para o método chamado quando o valor da propriedade é recuperado

→ Adicione @attr.deleter

Use para o método chamado quando a propriedade é deletada usando del

Programação orientada a objetos em Python

Vamos praticar!

Programação orientada a objetos em Python

Preparing Video For Download...