Menu
Coddy logo textTech

Metody statyczne i klasowe

Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 39 z 64.

Oprócz zwykłych metod instancji klasy mogą mieć metody statyczne i metody klasowe, które służą różnym celom.

Oto przykład metody statycznej:

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

Metody statyczne nie potrzebują self i działają jak zwykłe funkcje. Wywołuj je bezpośrednio z klasy:

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

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

Oto przykład metody klasy:

class Person:
    count = 0  # Zmienna klasowa
    
    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")

Metody klasy otrzymują samą klasę (cls) jako pierwszy parametr:

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

Użyj metod klasy jako alternatywnych konstruktorów:

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

Porównaj wszystkie trzy typy metod w jednej klasie:

class Calculator:
    brand = "Python Calc"
    
    def __init__(self, owner):
        self.owner = owner
    
    # Metoda instancji – wymaga self, ma dostęp do danych instancji
    def show_owner(self):
        return f"Owned by {self.owner}"
    
    # Metoda klasy – wymaga cls, ma dostęp do danych klasy
    @classmethod
    def get_brand(cls):
        return cls.brand
    
    # Metoda statyczna – nie wymaga ani self, ani cls, jest po prostu funkcją pomocniczą
    @staticmethod
    def multiply(x, y):
        return x * y
calc = Calculator("Alice")
print(calc.show_owner())        # Należy do Alice
print(Calculator.get_brand())   # Python Calc
print(Calculator.multiply(4, 5)) # 20

Wynik:

8
True
2
Anonymous
3
Owned by Alice
Python Calc
20

Możesz wywoływać metody klasowe i statyczne również z instancji:

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

Najważniejsze różnice:

  • Metody instancji: Wymagają self, mają dostęp do danych instancji
  • Metody klasowe: Wymagają cls, mają dostęp do danych klasy, przydają się jako alternatywne konstruktory
  • Metody statyczne: Nie wymagają żadnego z nich, są po prostu funkcjami pomocniczymi powiązanymi z klasą

Kluczowa kwestia: używaj @staticmethod w przypadku funkcji pomocniczych, które logicznie należą do klasy, ale nie potrzebują danych klasy ani instancji. Używaj @classmethod, gdy potrzebujesz dostępu do samej klasy, na przykład w przypadku alternatywnych konstruktorów lub dostępu do zmiennych klasy.

challenge icon

Wyzwanie

Łatwy

W tym wyzwaniu zaimplementujesz klasę Temperature o określonych funkcjach, korzystając z kompleksowego frameworka testowego.

Musisz edytować wyłącznie plik temperature.py, kierując się komentarzami TODO, które wskazują, co należy zaimplementować. Klasa powinna zawierać:

  • Zmienną klasową do przechowywania odczytów temperatury
  • Metodę statyczną do konwersji temperatury
  • Metody klasowe do dodawania odczytów i obliczania średnich

Spróbuj swoich sił

from temperature import Temperature

# Obsługa przypadków testowych do kompleksowego testowania
test_case = input()

if test_case == "default_test":
    # Przetestuj podstawowe działanie
    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":
    # Przetestuj average_reading bez odczytów
    Temperature.celsius_readings = []
    print(f"Average reading: {Temperature.average_reading()}")

elif test_case == "single_reading":
    # Przetestuj z pojedynczym odczytem
    Temperature.celsius_readings = []
    Temperature.add_reading(100)
    print(f"Average reading: {Temperature.average_reading()}")

elif test_case == "negative_values":
    # Przetestuj z ujemnymi wartościami temperatury
    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":
    # Przetestuj z odczytem 0°C
    print(f"0°C is {Temperature.celsius_to_fahrenheit(0)}°F")

elif test_case == "extreme_values":
    # Przetestuj ze skrajnymi wartościami temperatury
    absolute_zero = -273.15  # zero bezwzględne w stopniach Celsjusza
    sun_surface = 5500  # przybliżona temperatura powierzchni Słońca w stopniach Celsjusza
    
    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":
    # Przetestuj resetowanie odczytów
    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":
    # Przetestuj z wartościami dziesiętnymi
    Temperature.celsius_readings = []
    Temperature.add_reading(36.5)  # Normalna temperatura ciała
    Temperature.add_reading(37.2)  # Lekko podwyższona temperatura
    Temperature.add_reading(36.9)  # Normalne wahanie
    print(f"Average reading: {Temperature.average_reading()}")

elif test_case == "many_readings":
    # Test z wieloma odczytami
    Temperature.celsius_readings = []
    for i in range(1, 101):
        Temperature.add_reading(i)
    print(f"Average reading with 100 values: {Temperature.average_reading()}")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Python online