Anasayfa / PYTHON / Python Sınıflar (Classes) ve Nesneler (Objects)

Python Sınıflar (Classes) ve Nesneler (Objects)

Python programlama dilinde veri tiplerini, döngüleri ve fonksiyonları öğrendikten sonra atacağınız en büyük ve en profesyonel adım Nesne Yönelimli Programlama (Object-Oriented Programming – OOP) dünyasına giriş yapmaktır. İster basit bir otomasyon betiği yazıyor olun, ister milyonlarca kullanıcısı olan bir web uygulaması geliştiriyor olun, kodlarınızı sınıflar (classes) ve nesneler (objects) hâlinde organize etmek size inanılmaz bir esneklik ve güç kazandıracaktır.

Yeni başlayanlara yönelik hazırladığımız bu kapsamlı rehberde, Python’da nesne yönelimli programlamanın temellerini, sınıf ve nesne kavramlarını, nitelikleri ve metotları gerçek hayattan bol örneklerle adım adım öğreneceksiniz.

1. Nesne Yönelimli Programlama (OOP) Nedir?

Nesne Yönelimli Programlama (OOP), birbiriyle ilişkili veri alanlarını (değişkenleri) ve bu veriler üzerinde işlem yapan prosedürleri (metotları) nesneler (objects) içinde gruplandıran bir programlama yaklaşımıdır. Bu yaklaşımda gerçek dünyadaki varlıklar, birbirleriyle etkileşime giren bireysel nesneler olarak modellenir. Örneğin, bir sosyal medya platformunda bir hesabı, başka hesapları takip edebilen ve mesaj gönderebilen bir “nesne” olarak modelleyebiliriz.

OOP dünyasının size sunduğu iki çok önemli temel kavram vardır:

  • Kapsülleme (Encapsulation): Verileri ve bu veriler üzerinde çalışan prosedürleri tek bir birim (nesne) içinde paketlemeyi içeren temel bir OOP konseptidir. Kapsülleme sayesinde, nesnenin verilerine dışarıdan doğrudan erişim kısıtlanır ve verilerin yanlışlıkla veya yetkisiz şekilde değiştirilmesi engellenir. Örneğin, bir konser bileti satış sitesinde satılan bilet sayısının yanlışlıkla değiştirilmesini engellemek için kapsülleme kullanılır.
  • Soyutlama (Abstraction): Bir birimin iç işleyişinin, bu detayları bilmesine gerek olmayan kullanıcılardan veya diğer birimlerden gizlendiği bir diğer önemli kavramdır. Örneğin, bir otomobil sürücüsünün motorun anlık ve tam sayısal sıcaklık değerini bilmesine gerek yoktur; bunun yerine araç, sıcaklığın uygun aralıkta olup olmadığını gösteren basit bir gösterge (soyutlama) sunar.

2. Sınıf (Class) ve Nesne (Instance) Kavramları

Bir sosyal medya uygulamasında milyonlarca profili yöneten bir yazılım sistemi geliştirdiğinizi düşünün; her bir profilin sahip olacağı alanları ve işlemleri tanımlayan bir “ana plana” ihtiyacınız olacaktır. Bir Python programında sınıf (class), öznitelikleri (alanlar) ve metotları (prosedürler) olan bir nesne türünü tanımlar ve nesneler oluşturmak için kullanılan bir şablon (blueprint) işlevi görür. Sınıf türünden oluşturulan bu bireysel nesnelere ise örnek (instance) adı verilir.

Yani “Araba” genel bir Sınıf (Class) iken, sizin kapınızın önünde duran kırmızı renkli, 2020 model Honda marka aracınız o sınıfın bir Nesnesidir (Instance).

3. Python’da İlk Sınıfımızı Oluşturalım: __init__() ve self Kavramı

Sınıflardan nesneler (örnekler) üretirken, bu nesnelerin başlangıç değerlerini ayarlamamız gerekir. Python’da __init__(), bir sınıfın yeni bir örneği oluşturulduğunda her seferinde otomatik olarak çağrılan özel bir metottur. Bu metot diğer programlama dillerinde yapıcı (constructor) olarak da bilinir.

Bu metodun içinde her zaman self kelimesini görürüz. __init__() metodu, örneğin (nesnenin) niteliklerini tanımlamak ve başlatmak için self kelimesini kullanır. self, sınıfın o anki örneğini ifade eder ve sınıf metotlarında o spesifik örneğe erişmek için kullanılır.

Örnek Uygulama: Kedi Sınıfı

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

# Kedi sınıfından yeni nesneler (örnekler) oluşturuyoruz
kedi1 = Kedi("Tarçın", 2, "Tekir")
kedi2 = Kedi("Pamuk", 4, "Van Kedisi")

print(kedi1.isim, "bir", kedi1.cins, "kedisidir.")

Yukarıdaki kodda Kedi adında bir şablon (sınıf) yarattık. kedi1 ve kedi2 nesnelerini oluşturduğumuz anda arka planda __init__() metodu otomatik olarak çalıştı ve bizim verdiğimiz “Tarçın” ve “Pamuk” gibi değerleri kalıcı olarak o nesnelerin içine kaydetti.

4. Sınıf Nitelikleri ve Örnek Nitelikleri Arasındaki Farklar

Sınıf içerisinde tanımladığımız değişkenlere “nitelik” (attribute) diyoruz. Python’da nitelikler ikiye ayrılır:

  • Örnek Niteliği (Instance Attribute): Bir sınıfın her bir örneğine özgü olan ve ornek_adi.nitelik_adi formatında erişilen bir değişkendir. Yukarıdaki Kedi örneğimizdeki isim ve yas değişkenleri birer örnek niteliğidir çünkü her kedinin ismi ve yaşı kendine özeldir.
  • Sınıf Niteliği (Class Attribute): Doğrudan sınıfa ait olan ve o sınıfın tüm örnekleri tarafından paylaşılarak ortak kullanılan değişkenlerdir. Sınıf niteliklerine sinif_adi.nitelik_adi formatında erişilir.

Örnek Uygulama: Çalışanlar Sınıfı

class Calisan:
    # Sınıf Niteliği (Tüm çalışanlar için ortaktır)
    sirket_adi = "Tech Bilişim A.Ş."

    def __init__(self, ad, maas):
        # Örnek Nitelikleri (Her çalışana özeldir)
        self.ad = ad
        self.maas = maas

calisan1 = Calisan("Ali", 15000)
calisan2 = Calisan("Ayşe", 18000)

print(calisan1.ad, Calisan.sirket_adi, "şirketinde çalışıyor.")

Bu örnekte sirket_adi bir sınıf niteliğidir; Ali ve Ayşe farklı maaşlara ve isimlere sahip olsalar da ikisi de aynı şirket ismini paylaşırlar.

5. Örnek Metotları (Instance Methods) ile Davranış Ekleme

Sınıflar sadece veri depolamakla kalmaz, aynı zamanda bu verilerle çeşitli işlemler yapabilen fonksiyonlar da barındırırlar. Sınıf içerisinde tanımlanan bu fonksiyonlara metot denir. Örnek metotları (instance methods), hem örnek niteliklerine hem de sınıf niteliklerine erişmek ve bunları değiştirmek için kullanılır.

Bir metodun örnek metodu olabilmesi için ilk parametresinin her zaman self olması zorunludur.

Örnek Uygulama: Araba Hızlandırma

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

    # Örnek metodu tanımlıyoruz
    def hizlan(self, artis_miktari):
        self.hiz = self.hiz + artis_miktari
        print(f"{self.marka} {self.model} hızlandı. Yeni hız: {self.hiz} km/s")

# Yeni bir araba nesnesi oluşturma
benim_arabam = Araba("Toyota", "Civic")

# Arabanın metodunu çağırarak davranış sergilemesini sağlama
benim_arabam.hizlan(30)
benim_arabam.hizlan(20)

Gördüğünüz gibi, hizlan isimli metot, arabanın hiz niteliğini kalıcı olarak güncelleyerek nesneye bir aksiyon, bir davranış kazandırmış oldu.

6. İleri Seviye: Sihirli Metotlar (Magic Methods) ve Operatör Aşırı Yükleme

Python, sınıflarımızı tasarlarken bize inanılmaz bir esneklik sunar. Sihirli metotlar (magic methods) veya dunder (double underscore) metotları, kullanıcıların doğrudan görmediği arka plan işlemlerini gerçekleştiren özel metotlardır. Bu metotlar isimlerinin başında ve sonunda iki alt tire (__) barındırır. Daha önce kullandığımız __init__() aslında bir sihirli metottur ve geliştiriciler tarafından davranışları özelleştirilmek üzere açıkça tanımlanabilirler.

Örneğin, oluşturduğunuz bir nesneyi print() fonksiyonu ile doğrudan ekrana düzgün bir metin olarak yazdırmak isterseniz __str__() sihirli metodunu özelleştirebilirsiniz.

Operatör Aşırı Yükleme (Operator Overloading) Operatör aşırı yükleme, yerleşik bir operatörün (+, -, * vb.) özel sınıflar için işlevini özelleştirmeyi ifade eder. Aritmetik operatörler, kullanıcı tanımlı sınıfların örneklerinde kolay değişiklikler yapılmasına izin vermek için sıklıkla aşırı yüklenir. Örneğin, iki farklı nesneyi + operatörü ile toplamak isterseniz, sınıfınızın içine __add__(self, other) sihirli metodunu tanımlayarak Python’a nesnelerin nasıl toplanacağını öğretebilirsiniz.

class Kutu:
    def __init__(self, agirlik):
        self.agirlik = agirlik

    # + operatörünü (Toplama) kendi sınıfımız için aşırı yüklüyoruz
    def __add__(self, diger_kutu):
        toplam_agirlik = self.agirlik + diger_kutu.agirlik
        return Kutu(toplam_agirlik)

kutu1 = Kutu(10)
kutu2 = Kutu(15)

yeni_kutu = kutu1 + kutu2  # __add__ metodu sayesinde + işareti çalışır
print("Yeni kutunun ağırlığı:", yeni_kutu.agirlik) # Çıktı: 25

Sonuç: Bu rehber boyunca, modern yazılım mühendisliğinin bel kemiği olan Nesne Yönelimli Programlama’nın (OOP) Python’da nasıl uygulandığını inceledik. Soyutlama ve kapsülleme mantığına dayanan sınıflar ve nesneler sayesinde, artık devasa projeleri birbirine karışmayan, bakımı kolay ve tekrar tekrar kullanılabilen küçük modüler bloklar halinde inşa edebilirsiniz. Kendi kod editörünüzü açarak BankaHesabi veya Kitaplik gibi sınıflar oluşturup bu kavramları pratik etmek, OOP mantığını tam anlamıyla kavramanızın en hızlı yoludur. İyi kodlamalar!

Etiketlendi:

Bir Yorum

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir