Menu
Coddy logo textTech

Metodi statici e di classe

Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 39 di 64.

Oltre ai normali metodi di istanza, le classi possono avere metodi statici e metodi di classe che svolgono scopi diversi.

Ecco un esempio di metodo statico:

class MathHelper:
    @staticmethod
    def add(a, b):
        return a + b
    
    @staticmethod
    def is_even(number):
        return number % 2 == 0

I metodi statici non hanno bisogno di self e funzionano come normali funzioni. Chiamali direttamente dalla classe:

result = MathHelper.add(5, 3)
print(result)

check = MathHelper.is_even(10)
print(check)

Ecco un esempio di metodo di classe:

class Person:
    count = 0  # Variabile di classe
    
    def __init__(self, name):
        self.name = name
        Person.count += 1
    
    @classmethod
    def get_count(cls):
        return cls.count
    
    @classmethod
    def create_anonymous(cls):
        return cls("Anonymous")

I metodi di classe ricevono la classe stessa (cls) come primo parametro:

person1 = Person("Alice")
person2 = Person("Bob")
print(Person.get_count())  # 2

Usa i metodi di classe come costruttori alternativi:

anonymous = Person.create_anonymous()
print(anonymous.name)      # Anonimo
print(Person.get_count())  # 3

Confronta tutti e tre i tipi di metodo in una sola classe:

class Calculator:
    brand = "Python Calc"
    
    def __init__(self, owner):
        self.owner = owner
    
    # Metodo di istanza - richiede self, accede ai dati dell'istanza
    def show_owner(self):
        return f"Owned by {self.owner}"
    
    # Metodo di classe - richiede cls, accede ai dati della classe
    @classmethod
    def get_brand(cls):
        return cls.brand
    
    # Metodo statico - non richiede né self né cls, è solo una funzione di utilità
    @staticmethod
    def multiply(x, y):
        return x * y
calc = Calculator("Alice")
print(calc.show_owner())        # Di proprietà di Alice
print(Calculator.get_brand())   # Python Calc
print(Calculator.multiply(4, 5)) # 20

Output:

8
True
2
Anonymous
3
Owned by Alice
Python Calc
20

Puoi chiamare anche i metodi di classe e statici dalle istanze:

calc = Calculator("Bob")
print(calc.get_brand())      # Python Calc
print(calc.multiply(2, 3))   # 6

Differenze principali:

  • Metodi di istanza: Richiedono self, accedono ai dati dell'istanza
  • Metodi di classe: Richiedono cls, accedono ai dati della classe, sono utili per costruttori alternativi
  • Metodi statici: Non richiedono né l'uno né l'altro, sono semplici funzioni di utilità correlate alla classe

Punto chiave: usa @staticmethod per le funzioni di utilità che appartengono logicamente alla classe ma non hanno bisogno dei dati della classe o dell’istanza. Usa @classmethod quando hai bisogno di accedere alla classe stessa, ad esempio per costruttori alternativi o per accedere alle variabili della classe.

challenge icon

Sfida

Facile

In questa sfida, implementerai una classe Temperature con funzionalità specifiche, avvalendoti di un framework di test completo.

Devi modificare solo il file temperature.py, seguendo i commenti TODO che guidano la tua implementazione. La classe dovrebbe includere:

  • Una variabile di classe per tenere traccia delle letture della temperatura
  • Un metodo statico per la conversione della temperatura
  • Metodi di classe per aggiungere letture e calcolare le medie

Provalo tu

from temperature import Temperature

# Gestore dei casi di test per test approfonditi
test_case = input()

if test_case == "default_test":
    # Verifica le funzionalità di base
    Temperature.celsius_readings = []
    Temperature.add_reading(25)
    Temperature.add_reading(30)
    Temperature.add_reading(27)
    
    print(f"Average reading: {Temperature.average_reading()}")
    print(f"22°C is {Temperature.celsius_to_fahrenheit(22)}°F")

elif test_case == "empty_readings":
    # Verifica average_reading senza letture
    Temperature.celsius_readings = []
    print(f"Average reading: {Temperature.average_reading()}")

elif test_case == "single_reading":
    # Verifica con una sola lettura
    Temperature.celsius_readings = []
    Temperature.add_reading(100)
    print(f"Average reading: {Temperature.average_reading()}")

elif test_case == "negative_values":
    # Verifica con valori di temperatura negativi
    Temperature.celsius_readings = []
    Temperature.add_reading(-10)
    Temperature.add_reading(-20)
    Temperature.add_reading(-30)
    print(f"Average reading: {Temperature.average_reading()}")
    print(f"-15°C is {Temperature.celsius_to_fahrenheit(-15)}°F")

elif test_case == "zero_value":
    # Verifica con una lettura di 0°C
    print(f"0°C is {Temperature.celsius_to_fahrenheit(0)}°F")

elif test_case == "extreme_values":
    # Verifica con valori di temperatura estremi
    absolute_zero = -273.15  # zero assoluto in gradi Celsius
    sun_surface = 5500  # temperatura approssimativa della superficie del Sole in gradi Celsius
    
    print(f"{absolute_zero}°C is {Temperature.celsius_to_fahrenheit(absolute_zero)}°F")
    print(f"{sun_surface}°C is {Temperature.celsius_to_fahrenheit(sun_surface)}°F")

elif test_case == "reset_readings":
    # Verifica il ripristino delle letture
    Temperature.celsius_readings = []
    Temperature.add_reading(10)
    Temperature.add_reading(20)
    Temperature.add_reading(30)
    print(f"Average reading before reset: {Temperature.average_reading()}")
    
    Temperature.celsius_readings = []
    print(f"Average reading after reset: {Temperature.average_reading()}")

elif test_case == "decimal_values":
    # Verifica con valori decimali
    Temperature.celsius_readings = []
    Temperature.add_reading(36.5)  # Temperatura corporea normale
    Temperature.add_reading(37.2)  # Febbre lieve
    Temperature.add_reading(36.9)  # Variazione normale
    print(f"Average reading: {Temperature.average_reading()}")

elif test_case == "many_readings":
    # Verifica con molte letture
    Temperature.celsius_readings = []
    for i in range(1, 101):
        Temperature.add_reading(i)
    print(f"Average reading with 100 values: {Temperature.average_reading()}")
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Python online