Menu
Coddy logo textTech

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 == 0

Statik 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())  # 2

Sı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 * y
calc = 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
20

Sınıf ve statik metotları örnekler üzerinden de çağırabilirsiniz:

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

Temel Farklar:

  • Örnek metotları: self gerektirir, örnek verilerine erişir
  • Sınıf metotları: cls gerektirir, 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.

challenge icon

Görev

Kolay

Bu 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ı: self gerektirir, örnek verilerine erişir
  • Sınıf metodları: cls gerektirir, 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 instance

Kendin 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()}")
quiz iconKendini test et

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