Proprietà

Programmazione orientata agli oggetti in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Modificare i valori degli attributi

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)
# Usa la sintassi a punto e = per modificare gli attributi
emp.salary = emp.salary + 5000
Programmazione orientata agli oggetti in Python

Modificare i valori degli attributi

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)
# Usa la sintassi a punto e = per modificare gli attributi
emp.salary = emp.salary + 5000

 

 

Controllare l'accesso agli attributi?

  • verifica la validità del valore
  • o rendi gli attributi di sola lettura
    • modificare set_salary() non impedirebbe emp.salary = -100
Programmazione orientata agli oggetti in Python

Attributi limitati e di sola lettura

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
# causerà un errore
df.columns = ["new_colA", "new_colB", "extra"]
df
ValueError: Lunghezza non corrispondente: 
L'asse previsto ha 2 elementi, 
i nuovi valori hanno 3 elementi
df.shape = (43, 27)
df
AttributeError: impossibile impostare l'attributo
Programmazione orientata agli oggetti in 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("Stipendio non valido") self._salary = new_salary

 

← Usa un attributo "protetto" con _ iniziale per memorizzare i dati

← Usa @property su un metodo il cui nome è esattamente quello dell'attributo limitato; restituisci l'attributo interno

← Usa @attr.setter su un metodo attr() che verrà chiamato su obj.attr = valore

  • il valore da assegnare passato come argomento
Programmazione orientata agli oggetti in 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("Stipendio non valido") self._salary = new_salary
emp = Employee("Miriam Azari", 35000)
# accesso alla "proprietà"
emp.salary
35000
emp.salary = 60000 # <-- @salary.setter
emp.salary = -1000
ValueError: Stipendio non valido
Programmazione orientata agli oggetti in Python

Perché usare @property?

  $$\text{\Large{Per l'utente: si comportano come attributi}}$$

 

$$\text{\Large{Per lo sviluppatore: controllo sull'accesso}}$$

Programmazione orientata agli oggetti in Python

Altre possibilità

→ Non aggiungere @attr.setter

Crea una proprietà di sola lettura

→ Aggiungi @attr.getter

Usa per il metodo chiamato quando il valore della proprietà viene recuperato

→ Aggiungi @attr.deleter

Usa per il metodo chiamato quando la proprietà viene eliminata usando del

Programmazione orientata agli oggetti in Python

Facciamo pratica!

Programmazione orientata agli oggetti in Python

Preparing Video For Download...