# Yapılar ve sınıflar: kendi türünü tanımlamak, metotlar ve nesne listeleri # # Bir kitabın adı, yazarı, sayfa sayısı ve yılı birbirine aittir. Bunları dört # ayrı değişkende tutmak yerine tek bir "Kitap" türünde toplarız. # yapi : ilgili verileri (alanları) ve onlarla çalışan fonksiyonları bir arada tutar # sinif : yapıya ek olarak kurucu (kur) ve self ile çalışan metotlar sunar # ── yapi: alanlar ve metotlar ───────────────────────────────── # Her alana bir varsayılan değer verilir; alanın türü bu değerden anlaşılır. # Yapının içindeki fonksiyonlara metot denir. Metotlar alanlara doğrudan adıyla ulaşır. yapi Kitap: ad = "" yazar = "" sayfa = 0 yil = 0 fonksiyon ozet() -> metin: don f"{ad} ({yazar}, {yil})" fonksiyon okuma_suresi(gunluk_sayfa: sayi) -> sayi: # Kalan sayfaları da saymak için yukarı yuvarlıyoruz. don (sayfa + gunluk_sayfa - 1) // gunluk_sayfa # ── sayilabilir: sınırlı seçenekler ─────────────────────────── # Bir değişken yalnız belli değerleri alabiliyorsa sayilabilir kullanılır. # Yanlış yazılan bir üye (Durum.KAYIP gibi) program çalışmadan yakalanır. sayilabilir Durum: RAFTA ODUNCTE # ── sinif: kurucu ve self ───────────────────────────────────── # kur(self, ...) nesne oluşturulurken çalışır. self "bu nesnenin kendisi" demektir; # self.ad, bu okuyucunun adı alanıdır. sinif Okuyucu: ad = "" okunan_sayfa = 0 kitap_sayisi = 0 fonksiyon kur(self, ad_: metin): self.ad = ad_ # Metot nesnenin kendi alanlarını değiştirir; değişiklik kalıcıdır. fonksiyon bitirdi(self, k: Kitap): self.okunan_sayfa = self.okunan_sayfa + k.sayfa self.kitap_sayisi = self.kitap_sayisi + 1 fonksiyon rapor(self) -> metin: don f"{self.ad}: {self.kitap_sayisi} kitap, toplam {self.okunan_sayfa} sayfa" # ════════════════ Program buradan başlıyor ════════════════ # ── Nesne oluşturmak ────────────────────────────────────────── # Yol 1: boş nesne oluşturup alanları tek tek doldurmak. k1 = Kitap() k1.ad = "Çalıkuşu" k1.yazar = "Reşat Nuri Güntekin" k1.sayfa = 544 k1.yil = 1922 # Yol 2: alanları tanım sırasıyla vermek (ad, yazar, sayfa, yil). k2 = Kitap("Kuyucaklı Yusuf", "Sabahattin Ali", 232, 1937) yazdir(k1.ozet()) yazdir(k2.ozet()) yazdir(f"{k2.ad} günde 20 sayfayla {k2.okuma_suresi(20)} günde biter.") # Yapıyı doğrudan yazdırınca bütün alanları görünür. yazdir(k2) yazdir() # ── Nesne listesi ───────────────────────────────────────────── raf = [k1, k2] raf.ekle(Kitap("İnce Memed", "Yaşar Kemal", 436, 1955)) raf.ekle(Kitap("Tutunamayanlar", "Oğuz Atay", 724, 1972)) raf.ekle(Kitap("Saatleri Ayarlama Enstitüsü", "Ahmet Hamdi Tanpınar", 382, 1961)) yazdir(f"{'Kitap':<30}{'Yazar':<22}{'Yıl':>5}{'Sayfa':>7}") yazdir("─".tekrarla(64)) dongu k icinde raf: yazdir(f"{k.ad:<30}{k.yazar:<22}{k.yil:>5}{k.sayfa:>7}") yazdir() # Listedeki nesnelerin alanlarıyla hesap: en kalın kitap ve toplam sayfa. en_kalin = raf[0] toplam_sayfa = 0 dongu k icinde raf: toplam_sayfa += k.sayfa eger k.sayfa > en_kalin.sayfa: en_kalin = k yazdir(f"Raftaki {raf.uzunluk()} kitap toplam {toplam_sayfa:,} sayfa.") yazdir(f"En kalını: {en_kalin.ozet()}, {en_kalin.sayfa} sayfa") # Yıla göre sıralama: her adımda kalan kitapların en eskisini öne alıyoruz (seçmeli sıralama). i = 0 iken i < raf.uzunluk(): en_eski = i j = i + 1 iken j < raf.uzunluk(): eger raf[j].yil < raf[en_eski].yil: en_eski = j j += 1 gecici = raf[i] raf[i] = raf[en_eski] raf[en_eski] = gecici i += 1 yazdir("Yayın yılına göre:") dongu k icinde raf: yazdir(f" {k.yil} {k.ad}") yazdir() # ── sayilabilir değerlerle çalışmak ─────────────────────────── durum = Durum.RAFTA yazdir(f"{k2.ad}: {durum}") durum = Durum.ODUNCTE eger durum == Durum.ODUNCTE: yazdir(f"{k2.ad} şu an ödünç verildi.") yazdir() # ── Sınıf nesnesiyle çalışmak ───────────────────────────────── # Okuyucu("Elif") yazınca kur(self, "Elif") çağrılır. elif = Okuyucu("Elif") emre = Okuyucu("Emre") elif.bitirdi(raf[0]) elif.bitirdi(raf[2]) emre.bitirdi(raf[4]) # Her nesnenin kendi alanları vardır; Elif'in okuduğu Emre'yi etkilemez. yazdir(elif.rapor()) yazdir(emre.rapor())