0Pricing
Python Academy · Lezione

Attributi di istanza e di classe

Distingua tra i dati propri di ogni oggetto e quelli condivisi a livello di classe.

Attributi di istanza e di classe è una lezione Python Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Python Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Python Academy include 4 lezioni in totale.

Introduzione

Comprendere la differenza tra gli attributi di istanza e quelli di classe previene bug difficili da individuare e consente di gestire in modo efficiente lo stato condiviso.

Attributo di classe

class Dog: legs = 4 — legs è condiviso da tutte le istanze. Vi si accede come Dog.legs o dog.legs.
class Dog:
    legs = 4
print(Dog.legs)
print(Dog().legs)

Attributo di istanza

self.name = name in __init__ è specifico dell'istanza. Ogni Dog ha il proprio name.
class Dog:
    def __init__(self, name):
        self.name = name
d1 = Dog('Rex')
d2 = Dog('Buddy')
print(d1.name, d2.name)

Ordine di ricerca degli attributi

Python controlla prima __dict__ dell'istanza, poi __dict__ della classe e infine le classi base. Gli attributi di istanza hanno la precedenza su quelli di classe.
class C:
    x = 10
c = C()
c.x = 99  # instance shadows class attr
print(c.x)  # 99
print(C.x)  # 10

Problema degli attributi di classe mutabili

class C: items = [] — TUTTE le istanze condividono la stessa lista. L'aggiunta di un elemento da un'istanza influisce su tutte le altre!
class C:
    items = []
C.items.append(1)
print(C().items)  # [1] — shared!

Come risolvere il problema dei mutabili

Sposti l'inizializzazione in __init__: def __init__(self): self.items = [] Ogni istanza riceve la propria lista.
class C:
    def __init__(self):
        self.items = []
c1 = C(); c2 = C()
c1.items.append(1)
print(c1.items, c2.items)

Ispezione di __dict__

obj.__dict__ è il dizionario degli attributi dell'istanza. Class.__dict__ è il dizionario degli attributi della classe.
class Dog:
    legs = 4
    def __init__(self, name): self.name = name
d = Dog('Rex')
print(d.__dict__)
print(Dog.__dict__.keys())

Metodi di classe come factory

@classmethod riceve cls (la classe) invece di self. Lo utilizzi come costruttore alternativo.
class Date:
    def __init__(self, y, m, d): self.y,self.m,self.d=y,m,d
    @classmethod
    def from_string(cls, s):
        y,m,d=map(int,s.split('-'))
        return cls(y,m,d)
dt=Date.from_string('2024-01-15')
print(dt.y,dt.m,dt.d)

Metodi statici

@staticmethod non riceve self né cls. Lo utilizzi per funzioni di utilità raggruppate logicamente con una classe, ma che non necessitano dell'istanza o della classe.
class MathUtils:
    @staticmethod
    def add(a, b): return a + b
print(MathUtils.add(3, 4))

Conteggio delle istanze con un attributo di classe

Un attributo di classe utilizzato come contatore tiene traccia del numero di istanze create.
class Widget:
    count = 0
    def __init__(self):
        Widget.count += 1
Widget(); Widget(); Widget()
print(Widget.count)

hasattr() e vars()

hasattr(obj, 'name') verifica l'esistenza di un attributo. vars(obj) equivale a obj.__dict__.
class P:
    def __init__(self, x): self.x = x
p = P(5)
print(hasattr(p, 'x'), hasattr(p, 'z'))
print(vars(p))

Controllo rapido

Che cosa accade quando si aggiunge un elemento alla lista mutabile di un attributo di classe da un'istanza?

Ripasso

Gli attributi di classe sono condivisi; gli attributi di istanza sono propri di ogni oggetto. La ricerca nell'istanza ha la precedenza su quella nella classe. Inizializzi i mutabili in __init__. Utilizzi @classmethod per i metodi factory.

Continui

Ottimo! Prosegua con la lezione successiva per approfondire le Sue competenze.

Domande Frequenti

La lezione «Attributi di istanza e di classe» è gratuita?

Sì — il testo completo di «Attributi di istanza e di classe» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Python Academy, passa a CoddyKit PRO. Il corso Python Academy include 4 lezioni in totale.

Cosa imparerò in «Attributi di istanza e di classe»?

Distingua tra i dati propri di ogni oggetto e quelli condivisi a livello di classe. Eserciti Python Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Python Academy?

Non è richiesta alcuna esperienza precedente. Python Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Attributi di istanza e di classe»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Python Academy?

Sì. Ogni lezione Python Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Classi e metodo __init__
  2. Attributi di istanza e di classe
  3. Metodi di istanza e self
  4. Metodi magici: __str__ e __repr__
← Torna a Python Academy