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 == 0Metody 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()) # 2Użyj metod klasy jako alternatywnych konstruktorów:
anonymous = Person.create_anonymous()
print(anonymous.name) # Anonymous
print(Person.get_count()) # 3Poró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 * ycalc = Calculator("Alice")
print(calc.show_owner()) # Należy do Alice
print(Calculator.get_brand()) # Python Calc
print(Calculator.multiply(4, 5)) # 20Wynik:
8
True
2
Anonymous
3
Owned by Alice
Python Calc
20Moż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)) # 6Najważ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.
Wyzwanie
ŁatwyW 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()}")Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online