Dati di istanza e di classe

Programmazione orientata agli oggetti in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Principi base della OOP

 

Ereditarietà:

  • Estendere la funzionalità del codice esistente

Polimorfismo:

  • Creare un'interfaccia unificata

Incapsulamento:

  • Raggruppare dati e metodi
Programmazione orientata agli oggetti in Python

Dati a livello di istanza

class Employee:
    def __init__(self, name, salary):
       self.name = name
       self.salary = salary

emp1 = Employee("Teo Mille", 50000) 
emp2 = Employee("Marta Popov", 65000)
  • name, salary sono attributi di istanza
  • self si riferisce a un'istanza
Programmazione orientata agli oggetti in Python

Dati a livello di classe

  • Dati condivisi tra tutte le istanze di una classe
  • Definisci attributi di classe nel corpo della class
class MyClass:
    # Definisci un attributo di classe
    CLASS_ATTR_NAME = attr_value


  • "Variabile globale" all'interno della classe
Programmazione orientata agli oggetti in Python

Dati a livello di classe

class Employee:
  # Definisci un attributo di classe
  MIN_SALARY = 30000    #<--- no self. 

def __init__(self, name, salary): self.name = name # Usa il nome della classe per accedere all'attributo di classe if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
  • MIN_SALARY è condiviso tra tutte le istanze
  • Non usare self per definire un attributo di classe
  • usa ClassName.ATTR_NAME per accedere al valore dell'attributo di classe
Programmazione orientata agli oggetti in Python

Dati a livello di classe

class Employee:
  # Definisci un attributo di classe
  MIN_SALARY = 30000    

def __init__(self, name, salary): self.name = name # Usa il nome della classe per accedere all'attributo di classe if salary >= Employee.MIN_SALARY: self.salary = salary else: self.salary = Employee.MIN_SALARY
emp1 = Employee("TBD", 40000)
print(emp1.MIN_SALARY)
30000
emp2 = Employee("TBD", 60000)
print(emp2.MIN_SALARY)
30000
Programmazione orientata agli oggetti in Python

Perché usare attributi di classe?

Costanti globali relative alla classe

 

  • valori minimi/massimi per attributi
  • valori e costanti comuni, es. pi per una classe Cerchio
  • ...
Programmazione orientata agli oggetti in Python

Metodi di classe

  • I metodi sono già "condivisi": stesso codice per ogni istanza
  • I metodi di classe non possono usare dati a livello di istanza
class MyClass:

  @classmethod                         # <---usa il decoratore per dichiarare un metodo di classe

def my_awesome_method(cls, args...): # <---l'argomento cls si riferisce alla classe # Fai cose qui # Non può usare attributi di istanza :(
MyClass.my_awesome_method(args...)
Programmazione orientata agli oggetti in Python

Costruttori alternativi

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY
  • Può avere solo un __init__()

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)

  • Usa metodi di classe per creare oggetti
  • Usa return per restituire un oggetto
  • cls(...) chiamerà __init__(...)
Programmazione orientata agli oggetti in Python

Costruttori alternativi

class Employee:
  MIN_SALARY = 30000
  def __init__(self, name, salary=30000):
      self.name = name
      if salary >= Employee.MIN_SALARY:
        self.salary = salary
      else:
        self.salary = Employee.MIN_SALARY

  @classmethod
  def from_file(cls, filename):
      with open(filename, "r") as f:
          name = f.readline()
      return cls(name)        

file di testo contenente una riga con il nome del dipendente

# Crea un dipendente senza chiamare Employee()
emp = Employee.from_file("employee_data.txt")
type(emp)
__main__.Employee
Programmazione orientata agli oggetti in Python

Facciamo pratica!

Programmazione orientata agli oggetti in Python

Preparing Video For Download...