Statische und Klassenmethoden
Teil des Abschnitts Object Oriented Programming der Python-Journey von Coddy — Lektion 39 von 64.
Neben regulären Instanzmethoden können Klassen statische Methoden und Klassenmethoden haben, die unterschiedlichen Zwecken dienen.
Hier ist ein Beispiel für eine statische Methode:
class MathHelper:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(number):
return number % 2 == 0Statische Methoden benötigen kein self und funktionieren wie reguläre Funktionen. Rufen Sie sie direkt über die Klasse auf:
result = MathHelper.add(5, 3)
print(result)
check = MathHelper.is_even(10)
print(check)Hier ist ein Beispiel für eine Klassenmethode:
class Person:
count = 0 # Klassenvariable
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")Klassenmethoden erhalten die Klasse selbst (cls) als ersten Parameter:
person1 = Person("Alice")
person2 = Person("Bob")
print(Person.get_count()) # 2Verwenden Sie Klassenmethoden als alternative Konstruktoren:
anonymous = Person.create_anonymous()
print(anonymous.name) # Anonym
print(Person.get_count()) # 3Vergleichen Sie alle drei Methodentypen in einer Klasse:
class Calculator:
brand = "Python Calc"
def __init__(self, owner):
self.owner = owner
# Instanzmethode - benötigt self, greift auf Instanzdaten zu
def show_owner(self):
return f"Owned by {self.owner}"
# Klassenmethode - benötigt cls, greift auf Klassendaten zu
@classmethod
def get_brand(cls):
return cls.brand
# Statische Methode - benötigt keines von beiden, nur eine Hilfsfunktion
@staticmethod
def multiply(x, y):
return x * ycalc = Calculator("Alice")
print(calc.show_owner()) # Im Besitz von Alice
print(Calculator.get_brand()) # Python Calc
print(Calculator.multiply(4, 5)) # 20Ausgabe:
8
True
2
Anonymous
3
Owned by Alice
Python Calc
20Sie können Klassen- und statische Methoden auch von Instanzen aus aufrufen:
calc = Calculator("Bob")
print(calc.get_brand()) # Python Calc
print(calc.multiply(2, 3)) # 6Wesentliche Unterschiede:
- Instanzmethoden: benötigen
self, greifen auf Instanzdaten zu - Klassenmethoden: benötigen
cls, greifen auf Klassendaten zu, gut geeignet für alternative Konstruktoren - Statische Methoden: benötigen keines von beidem, lediglich Hilfsfunktionen, die mit der Klasse in Verbindung stehen
Wichtiger Punkt: Verwenden Sie @staticmethod für Hilfsfunktionen, die logisch zur Klasse gehören, aber keine Klassen- oder Instanzdaten benötigen. Verwenden Sie @classmethod, wenn Sie Zugriff auf die Klasse selbst benötigen, wie zum Beispiel für alternative Konstruktoren oder den Zugriff auf Klassenvariablen.
Aufgabe
EinfachIn dieser Herausforderung implementieren Sie eine Temperature-Klasse mit spezifischer Funktionalität und nutzen dabei ein umfassendes Test-Framework.
Sie müssen nur die Datei temperature.py bearbeiten und dabei den TODO-Kommentaren folgen, die Sie durch die Implementierung führen. Die Klasse sollte Folgendes enthalten:
- Eine Klassenvariable zur Verfolgung von Temperaturmesswerten
- Eine statische Methode zur Temperaturumrechnung
- Klassenmethoden zum Hinzufügen von Messwerten und zur Berechnung von Durchschnittswerten
Spickzettel
Klassen können drei Arten von Methoden haben: Instanzmethoden, statische Methoden und Klassenmethoden.
Statische Methoden verwenden den @staticmethod-Dekorator, benötigen kein self und funktionieren wie reguläre Funktionen:
class MathHelper:
@staticmethod
def add(a, b):
return a + b
# Direkt von der Klasse aufrufen
result = MathHelper.add(5, 3)Klassenmethoden verwenden den @classmethod-Dekorator und erhalten die Klasse (cls) als ersten Parameter:
class Person:
count = 0
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")
# Verwendung
print(Person.get_count())
anonymous = Person.create_anonymous()Wesentliche Unterschiede:
- Instanzmethoden: Benötigen
self, greifen auf Instanzdaten zu - Klassenmethoden: Benötigen
cls, greifen auf Klassendaten zu, gut für alternative Konstruktoren - Statische Methoden: Benötigen beides nicht, nur Hilfsfunktionen, die mit der Klasse in Verbindung stehen
Sowohl Klassen- als auch statische Methoden können von der Klasse oder von Instanzen aufgerufen werden:
Calculator.multiply(4, 5) # Von der Klasse
calc.multiply(4, 5) # Von der InstanzProbier es selbst
from temperature import Temperature
# Testfall-Handler für umfassende Tests
test_case = input()
if test_case == "default_test":
# Grundlegende Funktionalität testen
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":
# average_reading ohne Messwerte testen
Temperature.celsius_readings = []
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "single_reading":
# Mit einem einzelnen Messwert testen
Temperature.celsius_readings = []
Temperature.add_reading(100)
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "negative_values":
# Mit negativen Temperaturwerten testen
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":
# Mit einem Messwert von 0°C testen
print(f"0°C is {Temperature.celsius_to_fahrenheit(0)}°F")
elif test_case == "extreme_values":
# Mit extremen Temperaturwerten testen
absolute_zero = -273.15 # Absoluter Nullpunkt in Celsius
sun_surface = 5500 # Ungefähre Sonnenoberflächentemperatur in 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":
# Zurücksetzen der Messwerte testen
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":
# Mit Dezimalwerten testen
Temperature.celsius_readings = []
Temperature.add_reading(36.5) # Normale Körpertemperatur
Temperature.add_reading(37.2) # Leichtes Fieber
Temperature.add_reading(36.9) # Normale Variation
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "many_readings":
# Mit vielen Messwerten testen
Temperature.celsius_readings = []
for i in range(1, 101):
Temperature.add_reading(i)
print(f"Average reading with 100 values: {Temperature.average_reading()}")Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktor-Methode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDie super()-FunktionMethoden überschreibenMehrfachvererbungMethod Resolution OrderZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden
Einführung in Magic MethodsOperator-ÜberladungMagic Methods für ContainerRückblick - Eigene Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung2Dekoratoren
Einführung in DekoratorenProperty-DekoratorStatischer Methoden-DekoratorKlassenmethoden-Dekorator5Polymorphismus
Methoden-Überschreiben vertieftDuck TypingAbstrakte Klassen und MethodenInterface-DesignZusammenfassung – Formen-Rechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische und KlassenmethodenKlassendekoratorenContext Manager3Klasseneigenschaften
Instanz- vs. KlassenvariablenProperty-DekoratorenPrivate AttributeZusammenfassung – Bankkonto-Manager6Kapselung
Public, Protected, Private MemberZugriffsmodifikatorenInformation HidingProperty-Decorators für FortgeschritteneZusammenfassung - Studentenverwaltungssystem12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen