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 == 0I 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()) # 2Usa i metodi di classe come costruttori alternativi:
anonymous = Person.create_anonymous()
print(anonymous.name) # Anonimo
print(Person.get_count()) # 3Confronta 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 * ycalc = Calculator("Alice")
print(calc.show_owner()) # Di proprietà di Alice
print(Calculator.get_brand()) # Python Calc
print(Calculator.multiply(4, 5)) # 20Output:
8
True
2
Anonymous
3
Owned by Alice
Python Calc
20Puoi chiamare anche i metodi di classe e statici dalle istanze:
calc = Calculator("Bob")
print(calc.get_brand()) # Python Calc
print(calc.multiply(2, 3)) # 6Differenze 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.
Sfida
FacileIn 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()}")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
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online