Menu
Coddy logo textTech

Sihirli Metotlara Giriş

Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 33 / 64.

Sihirli metotlar (dunder metotları olarak da adlandırılır), başında ve sonunda çift alt çizgi bulunan özel metotlardır. Python, belirli işlemlere yanıt olarak bunları otomatik olarak çağırır.

İşte sihirli metotlara sahip bir sınıf örneği:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

__init__ metodu, bir nesne oluşturduğunuzda otomatik olarak çağrılır:

my_book = Book("Python Programming", "John Smith", 350)

__str__ metodu, nesneyi bir dizeye dönüştürdüğünüzde otomatik olarak çağrılır:

print(my_book)        # __str__ metodunu otomatik olarak çağırır
print(str(my_book))   # Ayrıca __str__ metodunu çağırır

Çıktı:

Python Programming by John Smith
Python Programming by John Smith

__str__ metodu olmadan, yazdırma işlemi nesnenin bellek konumunu gösterir:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

Uzunluk için başka bir sihirli metot ekleyin:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # __len__ metodunu otomatik olarak çağırır

Çıktı:

350

Önemli Nokta: Sihirli metotlar çift alt çizgi (__method__) ile başlar ve biter ve Python tarafından otomatik olarak çağrılırlar. Nesnelerinizin str(), len() gibi yerleşik fonksiyonlarla ve operatörlerle çalışmasına olanak tanıyarak sınıflarınızı daha Pythonic ve kullanımı daha sezgisel hale getirirler.

challenge icon

Görev

Kolay

Bu meydan okumada, sihirli metotlara sahip bir Counter sınıfı uygulayacaksınız.

  • counter.py - Düzenlemeniz gereken dosyadır ve uygulamanıza rehberlik edecek TODO yorumları içerir
  • driver.py - Kapsamlı test durumları içerir

TODO yorumlarını takip ederek counter.py dosyasındaki Counter sınıfını ve driver.py dosyasındaki test durumlarını uygulayın. Sınıf; isteğe bağlı değerlerle başlatmayı, dize temsilini ve toplama işlemlerini desteklemelidir.

Kopya kağıdı

Sihirli metotlar (dunder metotları), Python'un belirli işlemlere yanıt olarak otomatik olarak çağırdığı, çift alt çizgili özel metotlardır.

Yaygın sihirli metotlar:

  • __init__ - Bir nesne oluşturulduğunda çağrılır
  • __str__ - str() veya print() ile dizeye dönüştürülürken çağrılır
  • __len__ - len() fonksiyonu kullanılırken çağrılır
class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(my_book)        # Otomatik olarak __str__ metodunu çağırır
print(len(my_book))   # Otomatik olarak __len__ metodunu çağırır

__str__ olmadan, yazdırma işlemi okunabilir bir format yerine nesnenin bellek konumunu gösterir.

Kendin dene

# TODO: counter.py dosyasından Counter sınıfını içe aktarın
# Şu formatı kullanın: from counter import Counter

# Kapsamlı test durumu işleyicisi
test_case = input()

if test_case == "init_test":
    # TODO: Varsayılan değerle başlatmayı test edin
    # Hiçbir argüman olmadan bir sayaç oluşturun ve yazdırın
    # Beklenen çıktı: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: Belirli bir değerle başlatmayı test edin
    # Başlangıç değeri 10 olan bir sayaç oluşturun ve yazdırın
    # Not: print() dolaylı olarak __str__ metodunu çağırır, ancak buradaki odak noktamız __init__ metodunu test etmektir
    # Beklenen çıktı: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: Toplama işlemini test edin
    # Değeri 3 olan bir sayaç oluşturun, üzerine 7 ekleyin ve sonucu yazdırın
    # Beklenen çıktı: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: Zincirleme toplama işlemlerini test edin
    # Değeri 1 olan bir sayaç oluşturun, 2 ekleyin, ardından sonuca 3 ekleyin ve yazdırın
    # Beklenen çıktı: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: Negatif değerlerle test edin
    # Değeri -5 olan bir sayaç oluşturun ve yazdırın
    # Ardından üzerine -3 ekleyin ve sonucu yazdırın
    # Beklenen çıktılar: "Count: -5" ve "Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: Sıfır değerleriyle test edin
    # Değeri 0 olan bir sayaç oluşturun, 0 ekleyin ve yazdırın
    # Beklenen çıktı: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: Büyük değerlerle test edin
    # Değeri 1000000 olan bir sayaç oluşturun ve 9000000 ekleyin
    # Beklenen çıktı: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: Birden fazla sayaç arasındaki etkileşimi test edin
    # Değeri 5 olan counter1 ve değeri 10 olan counter2 oluşturun
    # Her iki sayacı da yazdırın
    # Beklenen çıktılar: "Count: 5" ve "Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: Farklı türleri eklemeyi test edin
    # Değeri 5 olan bir sayaca bir ondalıklı sayı (2.5) eklemeyi deneyin
    # Beklenen çıktı: "Count: 7.5"
    pass
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