Statik ve Sınıf Metotları
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 39 / 64.
Normal örnek metotlarının yanı sıra, sınıflar farklı amaçlara hizmet eden statik metotlara ve sınıf metotlarına sahip olabilir.
İşte bir statik metot örneği:
class MathHelper:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(number):
return number % 2 == 0Statik metotlar self parametresine ihtiyaç duymazlar ve normal fonksiyonlar gibi çalışırlar. Onları doğrudan sınıf üzerinden çağırın:
result = MathHelper.add(5, 3)
print(result)
check = MathHelper.is_even(10)
print(check)İşte bir sınıf metodu örneği:
class Person:
count = 0 # Sınıf değişkeni
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")Sınıf metotları, sınıfın kendisini (cls) ilk parametre olarak alır:
person1 = Person("Alice")
person2 = Person("Bob")
print(Person.get_count()) # 2Sınıf metotlarını alternatif yapıcılar olarak kullanın:
anonymous = Person.create_anonymous()
print(anonymous.name) # Anonim
print(Person.get_count()) # 3Üç yöntem türünün tamamını tek bir sınıfta karşılaştırın:
class Calculator:
brand = "Python Calc"
def __init__(self, owner):
self.owner = owner
# Örnek yöntemi - self gerektirir, örnek verilerine erişir
def show_owner(self):
return f"Owned by {self.owner}"
# Sınıf yöntemi - cls gerektirir, sınıf verilerine erişir
@classmethod
def get_brand(cls):
return cls.brand
# Statik yöntem - hiçbirine ihtiyaç duymaz, sadece bir yardımcı fonksiyondur
@staticmethod
def multiply(x, y):
return x * ycalc = Calculator("Alice")
print(calc.show_owner()) # Sahibi: Alice
print(Calculator.get_brand()) # Python Hesap Makinesi
print(Calculator.multiply(4, 5)) # 20Çıktı:
8
True
2
Anonymous
3
Owned by Alice
Python Calc
20Sınıf ve statik metotları örnekler üzerinden de çağırabilirsiniz:
calc = Calculator("Bob")
print(calc.get_brand()) # Python Calc
print(calc.multiply(2, 3)) # 6Temel Farklar:
- Örnek metotları:
selfgerektirir, örnek verilerine erişir - Sınıf metotları:
clsgerektirir, sınıf verilerine erişir, alternatif yapıcılar için uygundur - Statik metotlar: İkisini de gerektirmez, sadece sınıfla ilgili yardımcı fonksiyonlardır
Önemli Nokta: Sınıfa mantıksal olarak ait olan ancak sınıf veya örnek verisine ihtiyaç duymayan yardımcı fonksiyonlar için @staticmethod kullanın. Alternatif yapıcılar veya sınıf değişkenlerine erişmek gibi sınıfın kendisine erişmeniz gereken durumlar için @classmethod kullanın.
Görev
KolayBu challenge'da, kapsamlı bir test çerçevesinden yararlanırken belirli işlevlere sahip bir Temperature sınıfı uygulayacaksınız.
Uygulamanıza rehberlik eden TODO yorumlarını takip ederek yalnızca temperature.py dosyasını düzenlemeniz gerekmektedir. Sınıf şunları içermelidir:
- Sıcaklık ölçümlerini takip etmek için bir sınıf değişkeni
- Sıcaklık dönüşümü için bir statik metot
- Ölçüm eklemek ve ortalamaları hesaplamak için sınıf metotları
Kopya kağıdı
Sınıflar üç tür metoda sahip olabilir: örnek (instance) metodları, statik metodlar ve sınıf metodları.
Statik metodlar @staticmethod dekoratörünü kullanır, self parametresine ihtiyaç duymazlar ve normal fonksiyonlar gibi çalışırlar:
class MathHelper:
@staticmethod
def add(a, b):
return a + b
# Call directly from class
result = MathHelper.add(5, 3)Sınıf metodları @classmethod dekoratörünü kullanır ve ilk parametre olarak sınıfın kendisini (cls) alırlar:
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")
# Usage
print(Person.get_count())
anonymous = Person.create_anonymous()Temel farklar:
- Örnek metodları:
selfgerektirir, örnek verilerine erişir - Sınıf metodları:
clsgerektirir, sınıf verilerine erişir, alternatif yapıcılar (constructors) için uygundur - Statik metodlar: Hiçbirine ihtiyaç duymaz, sadece sınıfla ilgili yardımcı fonksiyonlardır
Hem sınıf hem de statik metodlar sınıf üzerinden veya örnekler üzerinden çağrılabilir:
Calculator.multiply(4, 5) # From class
calc.multiply(4, 5) # From instanceKendin dene
from temperature import Temperature
# Kapsamlı test için test senaryosu işleyicisi
test_case = input()
if test_case == "default_test":
# Temel işlevselliği test et
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":
# Hiç okuma yokken average_reading fonksiyonunu test et
Temperature.celsius_readings = []
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "single_reading":
# Tek bir okuma ile test et
Temperature.celsius_readings = []
Temperature.add_reading(100)
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "negative_values":
# Negatif sıcaklık değerleri ile test et
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":
# 0°C okuması ile test et
print(f"0°C is {Temperature.celsius_to_fahrenheit(0)}°F")
elif test_case == "extreme_values":
# Uç sıcaklık değerleri ile test et
absolute_zero = -273.15 # Celsius cinsinden mutlak sıfır
sun_surface = 5500 # Celsius cinsinden yaklaşık güneş yüzeyi sıcaklığı
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":
# Okumaları sıfırlamayı test et
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":
# Ondalık değerlerle test et
Temperature.celsius_readings = []
Temperature.add_reading(36.5) # Normal vücut sıcaklığı
Temperature.add_reading(37.2) # Hafif ateş
Temperature.add_reading(36.9) # Normal varyasyon
print(f"Average reading: {Temperature.average_reading()}")
elif test_case == "many_readings":
# Çok sayıda okuma ile test et
Temperature.celsius_readings = []
for i in range(1, 101):
Temperature.add_reading(i)
print(f"Average reading with 100 values: {Temperature.average_reading()}")Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı