Nesne Tabanlı Programlama 2

2 - Sınıflar, Nesneler ve Yapıcı Metotlar

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2026

Sınıflar ve Nesneler: Temel Kavramlar

  • Sınıf (Class): Nesnelerin planı veya şablonu. Nesnelerin hangi özelliklere (attributes) ve davranışlara (methods) sahip olacağını tanımlar.
  • Nesne (Object / Instance): Bir sınıfın örneği. Kendine özgü durum (state) ve davranış (behavior) taşır.

Analoji:

  • Sınıf: Kurabiye kalıbı
  • Nesne (Instance): Kurabiye kalıbından yapılmış tekil kurabiye

Nitelik ve Metot

  • OOP’ta bir nesnenin özelliklerine “nitelik” (attribute), işlevlerine ise “metot” (method) adı verilir.
  • Nitelikler, nesnenin durumunu temsil eden değişkenlerdir.
  • Metotlar, nesnenin davranışlarını temsil eden fonksiyonlardır.

Sınıf Tanımlama: class Anahtar Kelimesi

class Kopek:
    # Sınıfın özellikleri ve metotları buraya gelecek
    pass  # Şimdilik boş bırakıyoruz
  • class anahtar kelimesi ile sınıf tanımlanır.
  • Sınıf isimleri genellikle büyük harfle başlar (PascalCase).
  • pass ifadesi, şimdilik sınıfın içini boş bırakmak için kullanılır.

Nesne Oluşturma

kopek1 = Kopek()  # Kopek sınıfından bir nesne oluştur
kopek2 = Kopek()  # Başka bir Kopek nesnesi oluştur
  • Sınıf adını parantezlerle çağırarak nesne oluşturulur.
  • Her nesne, aynı sınıftan üretilmiş olsa da farklı nitelik değerlerine sahip olabilir.

__init__ Metodu: Başlatıcı (Initializer)

  • Bir sınıftan nesne oluşturulduğunda otomatik olarak çağrılan özel bir metottur.
  • Nesnenin başlangıç niteliklerini ayarlamak için kullanılır.
class Kopek:
    def __init__(self, isim, cins):
        self.isim = isim
        self.cins = cins

kopek1 = Kopek("Bobi", "Golden Retriever")
kopek2 = Kopek("Çakıl", "Terrier")

Not: Python’da __init__ ve “Constructor” İfadesi

Teknik Not

Birçok kaynak __init__ için “constructor” terimini kullanır; ancak Python’da __init__ daha doğru bir biçimde başlatıcı (initializer) gibi düşünülmelidir. Nesnenin yaratımı daha düşük seviyede gerçekleşir; __init__ bu yaratılmış nesnenin ilk durumunu kurar.

self Parametresi

  • Bir sınıfın içindeki instance metotların ilk parametresi self olmalıdır.
  • self, o anda üzerinde işlem yapılan nesneyi temsil eder.
  • Nesnenin niteliklerine ve diğer metotlarına self aracılığıyla erişilir.
class Kopek:
    def __init__(self, isim, cins):
        self.isim = isim
        self.cins = cins

    def havla(self):
        return f"{self.isim} havlıyor!"

kopek1 = Kopek("Bobi", "Golden Retriever")
print(kopek1.havla())  # Çıktı: Bobi havlıyor!

self Nasıl “Geçiyor”?

Aşağıdaki iki çağrı eşdeğerdir:

class Kopek:
    def __init__(self, isim, cins):
        self.isim = isim
        self.cins = cins

    def havla(self):
        return f"{self.isim} havlıyor!"

kopek1 = Kopek("Bobi", "Golden Retriever")

print(kopek1.havla())
Kopek.havla(kopek1)
  • kopek1.havla() yazdığınızda Python, metodu çağırırken nesneyi otomatik olarak ilk argüman (self) olarak iletir.

Nesneler ve Referanslar (Çok Önemli)

Python’da değişkenler çoğunlukla nesnenin kendisini değil, nesneye giden referansı tutar.

class Kopek:
    def __init__(self, isim, cins):
        self.isim = isim
        self.cins = cins

a = Kopek("Bobi", "Golden")
b = a            # b, a ile aynı nesneyi gösterir
b.isim = "Max"

print(a.isim)    # Çıktı: Max
print(b.isim)    # Çıktı: Max
  • b = a bir “kopya nesne” üretmez; aynı nesneyi işaret eden ikinci bir referans üretir.

Sınıf ve Örnek (Instance) Nitelikleri

  • Sınıf Nitelikleri (Class Attributes): Sınıfın kendisine ait özelliklerdir. Tüm nesneler tarafından paylaşılır.
  • Örnek Nitelikleri (Instance Attributes): Her nesnenin kendine özgü özellikleridir. self ile tanımlanırlar.

Sınıf/Örnek Niteliği Örneği

class Kopek:
    tur = "Memeli"  # Sınıf niteliği

    def __init__(self, isim, cins):
        self.isim = isim  # Örnek niteliği
        self.cins = cins  # Örnek niteliği

kopek1 = Kopek("Bobi", "Golden Retriever")
kopek2 = Kopek("Çakıl", "Terrier")

print(kopek1.isim)  # Çıktı: Bobi
print(kopek2.cins)  # Çıktı: Terrier
print(Kopek.tur)    # Çıktı: Memeli
print(kopek1.tur)   # Çıktı: Memeli (Sınıf niteliğine erişim)

Yaygın Tuzak: Paylaşılan (Mutable) Sınıf Niteliği

Neden tehlikeli?

Sınıf seviyesinde tanımlanan liste/sözlük gibi değiştirilebilir (mutable) yapılar, tüm nesneler tarafından paylaşılır.

class Ogrenci:
    notlar = []  # HATA: tüm nesneler aynı listeyi paylaşır

    def __init__(self, ad):
        self.ad = ad

a = Ogrenci("Ayşe")
b = Ogrenci("Mehmet")

a.notlar.append(100)

print(a.notlar)  # [100]
print(b.notlar)  # [100]  (beklenmeyen paylaşım)

Doğru yaklaşım:

class Ogrenci:
    def __init__(self, ad):
        self.ad = ad
        self.notlar = []  # Her nesneye özel liste

Metotlar (Instance, Class, Static)

  • Bir sınıfın içindeki fonksiyonlara metot denir.
  • Bu derste üç tür metotla karşılaşacağız: instance, class, static.

Instance Metotlar

  • Nesne üzerinde işlem yaparlar.
  • İlk parametreleri self olmalıdır.
  • Genellikle nesnenin niteliklerini okur/değiştirir.
class Kopek:
    def __init__(self, isim, cins):
        self.isim = isim
        self.cins = cins

    def havla(self):
        return f"{self.isim} havlıyor!"

    def otur(self):
        return f"{self.isim} oturuyor."

kopek1 = Kopek("Bobi", "Golden Retriever")
print(kopek1.havla())   # Çıktı: Bobi havlıyor!
print(kopek1.otur())    # Çıktı: Bobi oturuyor.

Class Metotlar

  • Sınıf üzerinde işlem yaparlar.
  • İlk parametreleri cls olmalıdır.
  • @classmethod dekoratörü ile tanımlanırlar.

Dekoratörler

Fonksiyonların veya metotların davranışlarını değiştirmek/genişletmek için kullanılan yapılardır. İleride daha sistematik ele alınacaktır.

class Kopek:
    tur = "Memeli"

    def __init__(self, isim, cins):
        self.isim = isim
        self.cins = cins

    @classmethod
    def tur_bilgisi(cls):
        return f"Köpekler {cls.tur} sınıfına aittir."

print(Kopek.tur_bilgisi())  # Çıktı: Köpekler Memeli sınıfına aittir.

Static Metotlar

  • Ne nesneye (self) ne de sınıfa (cls) ihtiyaç duyar.
  • Sınıf içinde gruplanmış “yardımcı fonksiyon” gibi düşünülebilir.
  • @staticmethod dekoratörü ile tanımlanırlar.
class Matematik:
    @staticmethod
    def topla(x, y):
        return x + y

sonuc = Matematik.topla(5, 3)
print(sonuc)  # Çıktı: 8

Static Metotlar: Çağırma Biçimi Notu

Stil Notu

Static metotlar teknik olarak instance üzerinden de çağrılabilir; ancak okunabilirlik açısından genellikle sınıf üzerinden çağrılması tercih edilir.

class Matematik:
    @staticmethod
    def topla(x, y):
        return x + y

m = Matematik()

print(Matematik.topla(2, 3))  # Önerilen
print(m.topla(2, 3))          # Çalışır, ama genellikle tercih edilmez

Metot Parametreleri: self ve cls Farkı

  • self: Instance metotlarında kullanılır; çağrılan nesneyi temsil eder.
  • cls: Class metotlarında kullanılır; çağrılan sınıfı temsil eder.

Basit Sınıf Örnekleri

Örnek 1: Araba Sınıfı

class Araba:
    def __init__(self, marka, model, renk):
        self.marka = marka
        self.model = model
        self.renk = renk

    def bilgileri_getir(self):
        return f"Marka: {self.marka}, Model: {self.model}, Renk: {self.renk}"

    def calistir(self):
        return "Araba çalıştırılıyor..."

    def durdur(self):
        return "Araba durduruluyor."

a = Araba("Toyota", "Corolla", "Beyaz")
print(a.bilgileri_getir())
print(a.calistir())
print(a.durdur())

Örnek 2: Dikdortgen Sınıfı

class Dikdortgen:
    def __init__(self, uzunluk, genislik):
        self.uzunluk = uzunluk
        self.genislik = genislik

    def alan_hesapla(self):
        return self.uzunluk * self.genislik

    def cevre_hesapla(self):
        return 2 * (self.uzunluk + self.genislik)

d = Dikdortgen(10, 4)
print(d.alan_hesapla())   # 40
print(d.cevre_hesapla())  # 28

Örnek 3: Hayvan Sınıfı (Düzeltilmiş ve Öğretici)

Bu örnek; sınıf niteliği, instance niteliği, instance metot ve static metot kavramlarını birlikte gösterir.

class Hayvan:
    alem = "Animalia"  # Sınıf niteliği (paylaşılan)

    def __init__(self, tur, yas, renk):
        self.tur = tur      # Instance niteliği
        self.yas = yas      # Instance niteliği
        self.renk = renk    # Instance niteliği

    def beslen(self):
        return f"{self.tur} besleniyor."

    @staticmethod
    def foo():
        return "haydaaaaa"

# Hayvan sınıfından örnek nesneler oluşturma
kedi = Hayvan("Kedi", 3, "Siyah")
kopek = Hayvan("Köpek", 5, "Kahverengi")

# Örnek nesneler üzerinde metotları çağırma
print(kedi.beslen())
print(kopek.beslen())
# Instance niteliği ve sınıf niteliği erişimi
print(kedi.yas)        # 3
print(Hayvan.alem)     # Animalia
# Static metot çağrısı
print(Hayvan.foo())    # haydaaaaa

Özet

  • Sınıflar, nesnelerin niteliklerini ve metotlarını tanımlayan şablonlardır.
  • Python’da __init__, nesnenin başlangıç durumunu kuran başlatıcı metottur.
  • self, instance metotlarında çağrılan nesneyi temsil eder; cls, class metotlarında çağrılan sınıfı temsil eder.
  • Değişkenler çoğunlukla nesnenin kendisini değil, nesneye giden referansı tutar.
  • Sınıf nitelikleri tüm nesneler tarafından paylaşılır; mutable sınıf nitelikleri dikkat gerektirir.
  • @staticmethod ve @classmethod, sırasıyla statik ve sınıf metotları tanımlamak için kullanılır.

Gelecek Hafta

  • Kalıtım (Inheritance)

    • Üst Sınıf (Superclass) ve Alt Sınıf (Subclass)
    • super() Fonksiyonu
    • Metot Ezme (Method Overriding)

Alıştırmalar

  1. Ogrenci adında bir sınıf tanımlayın. Öğrencilerin adı, soyadı, numarası ve notları (liste olarak) gibi özellikleri olsun.
  2. Ogrenci sınıfına, öğrencinin not ortalamasını hesaplayan bir metot ekleyin (değer döndürsün).
  3. Ogrenci sınıfına, öğrencinin bilgilerini metin olarak döndüren bir metot ekleyin (return ile).
  4. İki farklı Ogrenci nesnesi oluşturun ve bu öğrencilerin bilgilerini ve not ortalamalarını ekrana yazdırın.
  5. Ogrenci sınıfına bir sınıf değişkeni ekleyin (toplam_ogrenci_sayisi gibi) ve her yeni öğrenci oluşturulduğunda __init__ içinde bu sayıyı artırın. İki öğrenci üretip sayacı yazdırın.
  1. Kitap adında bir sınıf tanımlayın. Kitapların adı, yazarı, sayfa sayısı ve fiyatı gibi özellikleri olsun.
  2. Kitap sınıfına, kitabın bilgilerini metin olarak döndüren bir metot ekleyin.
  3. Kitap sınıfına, kitabın fiyatına belirli bir oranda indirim uygulayan bir metot ekleyin (yeni fiyatı döndürsün veya self.fiyat’ı güncellesin; hangisini seçtiğinizi gerekçelendirin).
  4. Üç farklı Kitap nesnesi oluşturun ve bu kitapların bilgilerini ekrana yazdırın. Bir kitabın fiyatına indirim uygulayın ve tekrar yazdırın.