🏗️ Sınıflar & OOP
Sınıflar & OOP: Decorator'ı bir hediye paketleme tezgâhı gibi düşün: kutunun içindekine hiç dokunmazsın, etrafına bir katman eklersin ve paket artık farklı davranır — üstünde kim
Decorator'ı bir hediye paketleme tezgâhı gibi düşün: kutunun içindekine hiç dokunmazsın, etrafına bir katman eklersin ve paket artık farklı davranır — üstünde kime gittiği yazar, kırılacak etiketi taşır. Kod tarafında da aynısı olur: decorator, başka bir fonksiyonu sarıp davranış ekleyen bir fonksiyondur, orijinali DEĞİŞTİRMEDEN. @ söz dizimiyle uygulanır; herhangi bir fonksiyon çağrısı etrafında 'ön işleme + son işleme' olarak düşünebilirsin. Peki aynı kodu fonksiyonun içine yazmak varken neden bu dolambaç? Çünkü 'ne yapıldığı' ile 'nasıl gözlendiği' iki ayrı sorumluluktur: 50 test fonksiyonuna tek tek log/retry/süre ölçümü kodu eklersen, bir gün o davranışı değiştirmek 50 dosyaya dokunmak demektir. Java'da bunun karşılığı annotation + AOP'tur (`@Transactional`, `@Retryable`) — Python'da ise aynı fikir dilin kendisine gömülüdür, ayrı bir framework gerekmez. QA'de bunu zaten her gün kullanıyorsun: pytest'in `@pytest.mark.parametrize`'ı, `@pytest.fixture`'ı ve Selenium suite'lerinde flaky testleri saran `@retry` decorator'ları hep bu mekanizmadır — test gövdesi sade kalır, tekrar/raporlama katmanı dışarıda durur.
Java'da constructor açıkça yazılır: public Car(String color) {...}. Python'da __init__ metodu constructor görevi görür. Python'daki 'self', Java'daki 'this' gibidir — ama Python'da her metoda açıkça yazılmalıdır.
Micro Lab: Python kod yazma
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
Java ile Karşılaştırma
Type Hint'ler (Tip İpuçları)
Python'da __init__ metodunun ilk parametresi nedir?
'self' bu sınıfın o anki instance'ını temsil eder — Java'daki 'this' gibi. Python'da her instance metoduna açıkça yazılır.
Python sınıf metodlarında (instance methods) nesnenin kendisini ifade eden standart parametre adı nedir?
Python'da instance metodlarının ilk parametresi, nesnenin kendisine referans verir ve geleneksel olarak 'self' adıyla tanımlanır.
Kalıtım, bir ailenin DNA'sını çocuğa aktarması gibi — ElectricCar, Car'dan türetilirse, Car'ın tüm özellikleri (renk, hız) otomatik olarak ElectricCar'da da vardır, üstüne pil kapasitesi eklenir. Ama burada düşünmeye değer bir tuzak var: Dog(Animal) sınıfının __init__ metodunda super().__init__(name) çağırmayı UNUTURSAN, ne olur? Animal'ın kendi __init__'i hiç çalışmaz — yani self.name asla atanmaz, ve bark() metodu çağrıldığında "AttributeError: no attribute 'name'" patlar. Java'da super(name) çağırmazsan derleyici seni otomatik olarak (eğer parametresiz bir constructor varsa) kurtarır veya hata verir — Python'da bu SESSİZCE atlanır, sadece metod çağrıldığında patlar. Yani kalıtım miras alır ama hiçbir şeyi OTOMATİK başlatmaz — sen tetiklemezsen, üst sınıfın kurulumu hiç çalışmaz.
Java'da 'extends' keyword'ü kullanılır: class Dog extends Animal. Python'da parantez içinde yazılır: class Dog(Animal). Her iki dilde de 'super()' ile parent constructor çağrılır.
Bir Decorator Nasıl Çalışır — Adım Adım
Decorator, fonksiyondan ÖNCE ve SONRA çalışır — proxy/wrapper kalıbı gibi. @timer söz dizimi şunun kısaltmasıdır: load_data = timer(load_data)