Python

Python’da Sınıf (class) ve Nesne Kavramı

Python'da Sınıf (class) ve Nesne Kavramı

Yazılım geliştirme süreçlerinde projeler büyüdükçe, yalnızca fonksiyonlar ve temel veri tipleri kullanarak kod tabanını yönetmek zorlaşır. Bu karmaşıklığı çözmek ve gerçek dünyadaki varlıkları yazılım ortamında daha verimli modellemek için Nesne Yönelimli Programlama (Object-Oriented Programming – OOP) yaklaşımı kullanılır. Python, doğası gereği nesne yönelimli bir dildir ve bu paradigmanın merkezinde python class ve nesne kavramları yer alır.

Nesne Yönelimli Programlama ve Sınıf Mantığı

Sınıf (class), bir nesnenin hangi özelliklere (niteliklere) ve hangi davranışlara (metotlara) sahip olacağını belirleyen soyut bir taslaktır. Mimari bir plan çizimine benzer; bir binanın planı tek başına yaşanabilir bir yapı değildir, ancak o plana sadık kalınarak onlarca gerçek bina inşa edilebilir.

Nesne (object) ise bu sınıftan türetilen, bellekte somut yer kaplayan ve kendine ait verileri barındıran örnektir (instance). Örneğin, genel bir “Sunucu” kavramı sınıfı ifade ederken; şirket ağında 192.168.1.10 IP adresiyle çalışan belirli bir fiziksel makine bu sınıfın somut bir nesnesidir.

İlk Sınıfın Tanımlanması ve Nesne Üretimi

Python’da bir sınıf oluşturmak için “class” anahtar kelimesi kullanılır. Geleneksel olarak sınıf isimleri büyük harfle başlar (PascalCase kuralı).

class Sunucu:
    pass

web_sunucusu = Sunucu()
veritabani_sunucusu = Sunucu()

print(type(web_sunucusu))
print(web_sunucusu)

Bu örnekte “Sunucu” adında en yalın haliyle bir sınıf tanımlanmıştır. “pass” ifadesi, sınıf gövdesinin şimdilik boş olduğunu belirtir. Ardından sınıftan iki bağımsız nesne üretilmiştir. Kod çalıştırıldığında, çıktı bu nesnelerin “Sunucu” tipinde olduğunu ve bellekte farklı adreslerde bulunduğunu gösterir.

Yapıcı Metot (__init__) ve self Parametresi

Bir sınıftan nesne üretildiğinde, o nesnenin ilk durumunu belirlemek ve gerekli başlangıç değerlerini atamak için yapıcı metot (constructor) devreye girer. Python’da bu görev __init__ isimli özel metot tarafından yürütülür.

self parametresi ise sınıftan üretilen nesnenin bizzat kendisini temsil eder. Sınıf içindeki metotlar, üzerinde işlem yaptıkları nesnenin verilerine self referansı aracılığıyla ulaşır.

class Sunucu:
    def __init__(self, ip_adresi, isletim_sistemi, ram_gb):
        self.ip_adresi = ip_adresi
        self.isletim_sistemi = isletim_sistemi
        self.ram_gb = ram_gb

prod_sunucu = Sunucu("10.0.0.5", "Ubuntu 22.04", 16)
test_sunucu = Sunucu("10.0.0.6", "Debian 12", 8)

print(prod_sunucu.ip_adresi)
print(test_sunucu.isletim_sistemi)

Yukarıdaki kod parçasında:

  • __init__ fonksiyonu üç farklı parametre alır.
  • self.ip_adresi ifadesi, parametre olarak gelen değeri oluşturulan nesnenin bir niteliği (attribute) haline getirir.
  • prod_sunucu ve test_sunucu bağımsız değerlerle başlatılır; birinde yapılan değişiklik diğerini etkilemez.

Sınıf Nitelikleri ve Örnek Nitelikleri

Python sınıflarında iki tür nitelik tanımlanabilir:

  • Örnek Nitelikleri (Instance Attributes): Yalnızca belirli bir nesneye ait olan verilerdir. __init__ içinde self ile tanımlanır.
  • Sınıf Nitelikleri (Class Attributes): O sınıftan üretilen tüm nesneler tarafından paylaşılan ortak verilerdir. Doğrudan sınıf gövdesinde tanımlanır.
class AgCihazi:
    protokol = "TCP/IP"

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

router = AgCihazi("Ana Router")
switch = AgCihazi("Ofis Switch")

print(router.protokol)
print(switch.protokol)
print(router.cihaz_adi)

Burada protokol sınıf niteliğidir; her iki cihaz için de aynı değeri taşır. cihaz_adi ise örnek niteliğidir ve her nesne için benzersizdir.

Sınıf İçinde Metot Tanımlama

Metotlar, bir sınıfın gerçekleştirebileceği eylemleri temsil eden fonksiyonlardır. Sıradan Python fonksiyonlarından temel farkı, ilk parametre olarak her zaman self değerini almalarıdır.

class Sunucu:
    def __init__(self, hostname):
        self.hostname = hostname
        self.calisiyor = False

    def baslat(self):
        if not self.calisiyor:
            self.calisiyor = True
            print(f"{self.hostname} baslatildi.")
        else:
            print(f"{self.hostname} zaten calisiyor durumda.")

    def durdur(self):
        if self.calisiyor:
            self.calisiyor = False
            print(f"{self.hostname} kapatildi.")
        else:
            print(f"{self.hostname} zaten kapali.")

dns_sunucu = Sunucu("DNS-01")
dns_sunucu.baslat()
dns_sunucu.baslat()
dns_sunucu.durdur()

Bu örnekte baslat ve durdur metotları, nesnenin iç durumunu (self.calisiyor) kontrol eder ve gerektiğinde bu durumu değiştirir. Bu yapı sayesinde veriler ve bu verileri işleyen mantık tek bir çatı altında toplanır.

Kapsamlı Uygulama: Güvenlik Duvarı Kural Yöneticisi

Sistem ve güvenlik alanında sıkça karşılaşılan bir senaryoyu ele alalım. Belirli IP adreslerini engelleyen ve gelen paketleri kontrol eden basit bir güvenlik duvarı nesnesi tasarlayalım:

class GuvenlikDuvari:
    def __init__(self, bolge_adi):
        self.bolge_adi = bolge_adi
        self.engellenen_ipler = []

    def ip_engelle(self, ip):
        if ip not in self.engellenen_ipler:
            self.engellenen_ipler.append(ip)
            print(f"{ip} adresi engelleme listesine eklendi.")
        else:
            print(f"{ip} adresi zaten engelli.")

    def erisim_kontrol(self, ip):
        if ip in self.engellenen_ipler:
            return f"Erisim Reddedildi: {ip} engellenmis durumda."
        return f"Erisim Onaylandi: {ip} guvenli."

    def listeyi_yazdir(self):
        print(f"[{self.bolge_adi}] Engellenen IP Listesi:")
        for ip in self.engellenen_ipler:
            print(f"- {ip}")

firewall = GuvenlikDuvari("DMZ-Bolgesi")
firewall.ip_engelle("198.51.100.23")
firewall.ip_engelle("203.0.113.5")

print(firewall.erisim_kontrol("198.51.100.23"))
print(firewall.erisim_kontrol("192.168.1.50"))
firewall.listeyi_yazdir()

Bu modelde GuvenlikDuvari sınıfı, hem IP listesini hafızasında tutar hem de bu listeyi denetleyecek güvenlik kurallarını metotlar halinde sunar. Böylece farklı ağ bölgeleri için ayrı güvenlik duvarı nesneleri türetilebilir.

Sınıf ve Nesne Kullanımının Avantajları

Yazılım projelerinde sınıflardan yararlanmanın getirdiği temel kazanımlar şunlardır:

  • Modülerlik: Karmaşık yazılım sistemleri bağımsız, yönetilebilir küçük parçalara bölünür.
  • Kodun Yeniden Kullanılabilirliği: Bir kez tanımlanan sınıf, ihtiyaç duyulan her yerde tekrar tekrar somutlaştırılabilir.
  • Bakım Kolaylığı: Bir verinin veya davranışın işleyişi değiştiğinde, yalnızca ilgili sınıfın kodunu güncellemek yeterli olur.
  • Veri Güvenliği ve Bütünlüğü: Nesneye ait veriler rastgele fonksiyonlar tarafından kontrolsüzce değiştirilemez; işlemler yalnızca tanımlı metotlar üzerinden yürütülür.

Özet ve Sonraki Adımlar

Python’da sınıf ve nesne yapısı, Nesne Yönelimli Programlamanın temel yapı taşını oluşturur. Bir sınıf ile veri ve davranışı şablonlaştırabilir, bu şablondan dilediğiniz kadar bağımsız nesne üreterek projelerinizi daha modüler ve ölçeklenebilir hale getirebilirsiniz.

Sınıf ve nesne mantığını kavradıktan sonraki adımda, kod tekrarını önleyen kalıtım (inheritance), veriye erişimi sınırlandıran kapsülleme (encapsulation) ve aynı arayüzün farklı biçimlerde çalışmasını sağlayan çok biçimlilik (polymorphism) gibi ileri düzey OOP konularını inceleyebilirsiniz.

#nesne yonelimli programlama#oop#python#python class#yazılım geliştirme

Comments

No comments yet. Write the first comment.

Write a comment

Comments are published after admin approval.