Classe in Python

Per più informazioni su oggetti e classi in python, vedere la pagina Oggetti e classi.

Per definire una classe si usano:

  • nome
  • classi da cui eredita
  • classi di cui è istanza
  • attributi
class C{(B1, B2, ..., BK)}
	<attributi>

object garantisce le proprietà fondamentali delle classi ed è alla base di ogni oggetto. È equivalente creare una classe con object come parametro.

flowchart LR
	A("class C(object):") <== equivalente ==> B("class C:")

Ereditarietà multipla

Python, a differenza di molti altri linguaggi, supporta l’ereditarietà multipla, ovvero si ha la possibilità per una classe di ereditare da più classi diverse. Questo viene gestito dall’Method Resolution Order, che ordina le superclassi, per andare a cercare gli attributi.

Istanze

Creare un’istanza di una classe in python avviene in due fasi:

  1. Creazione dell’oggetto vero e proprio
  2. Creazione e inizializzazione degli attributi
class C:
	def __init__(self, x, y):
		self.x = x
		self.y = y

L’init ha 3 parametri, perché il primo è l’oggetto stesso appena creato, che viene passato dalla funzione __new__ che ne gestisce il processo di istanziazione (che solitamente non deve essere gestito dallo sviluppatore). Gli altri due parametri sono gli attributi che verranno dati all’istanza.

def __new__(cls, e):
	# cls è la classe stessa
		
c = C(1, 2)

L’interprete, per inizializzare un oggetto di tipo C (c = C(1, 2)), esegue diversi passaggi:

  1. valutazione degli argomenti
  2. creazione di un oggetto C vuoto
  3. invoca __init__ passando l’oggetto creato sopra, e i parametri per riferimento
  4. init inserisce nell’oggetto gli attributi
  5. restituisce l’oggetto finale
title: Attenzione!
Non si possono aggiungere attributi a classi predefinite o ad oggetti.
`tuple.coord = 2`
`(1,2).num_tupla = 1`

È buona pratica aggiungere tutti gli attributi nell’__init__, così ogni istanza di quella classe ha gli stessi attributi, e tutte le istanze sono coerenti tra di loro. L’accesso agli attributi è alquanto oscuro se non si conosce bene LEGB.

Altri modi per definire una classe

  • Le classi si possono anche creare a runtime.

  • Se una classe viene sovrascritta da un’altra con lo stesso nome/handle, MA esiste ancora una istanza di quella classe, quella classe non è stata eliminata. Si potrà infatti utilizzare newObject = object.__class__() per creare un nuovo oggetto newObject di quella classe.

In Python, come già detto, le classi sono oggetti. Per creare questi oggetti, si utilizzano le metaclassi. Si faccia anche riferimento a [[Metaprogrammazione#istanziare-le-classi-tramite-call|Istanziare le classi tramite call]].

Classi come decoratori

Le classi si possono utilizzare anche come Classi come decoratori.