Python Nesne Yönelimli Programlama

"Python Nesne Yönelimli Programlama"

Python, nesne yönelimli programlama (OOP) desteği ile güçlü bir programlama dilidir. Nesne yönelimli programlama, bir programlama yaklaşımıdır ve bu yaklaşımı kullanarak karmaşık yazılımların geliştirilmesi kolaylaştırılır. Bu makalede, Python'da nesne yönelimli programlama hakkında detaylı bilgi vereceğiz.

Nesne Yönelimli Programlama Nedir?

Nesne yönelimli programlama, programlamada kullanılan bir paradigmadır. Bu paradigma, bir programın nesnelere dayalı olarak tasarlanmasını ve oluşturulmasını sağlar. Bir nesne, veri ve onunla ilgili işlemleri birleştiren bir varlıktır. Örneğin, bir araba nesnesi, marka, model, renk gibi verileri tutar ve aynı zamanda arabayı çalıştırma, fren yapma, hızlanma gibi işlemleri gerçekleştirebilir.

Nesne yönelimli programlama, şu prensiplere dayanır:

  • Soyutlama: Nesneler, gerçek hayattaki varlıkların soyutlamalarıdır. Nesnelerin özellikleri ve davranışları gerçek hayattaki varlıkların özellikleri ve davranışlarına benzemelidir.
  • Kalıtım: Kalıtım, bir nesnenin özelliklerinin başka bir nesne tarafından devralınmasıdır. Bu, kod tekrarını azaltır ve kodun yeniden kullanılabilirliğini artırır.
  • Çok biçimlilik: Çok biçimlilik, aynı yöntem isminin farklı nesneler tarafından farklı şekillerde uygulanabilmesidir. Bu, farklı nesnelerin benzer işlemleri gerçekleştirdiği durumlarda kullanışlıdır.
  • Kapsülleme: Kapsülleme, bir nesnenin davranışlarının ve özelliklerinin, diğer nesnelerden gizlenmesidir. Bu, bir nesnenin iç yapısının değiştirilmesine ihtiyaç duyulmadan, bir nesneyle etkileşimde bulunmanın sağlanmasını sağlar.

Python'da Nesne Yönelimli Programlama

Python, nesne yönelimli programlama desteği sunar. Bu, Python'da nesnelerin oluşturulması ve işlenmesi için birçok araç sağlar. Python'da nesne yönelimli programlama, sınıflar ve nesneler aracılığıyla gerçekleştirilir.

Sınıflar

Bir sınıf, nesnelerin blueprint'leridir. Bir sınıf, bir nesnenin özelliklerini (değişkenler) ve işlevlerini (metodlar) tanımlar. Sınıflar, aşağıdaki sözdizimiyle tanımlanır:

class SinifAdi:
    # sınıf değişkenleri
    degisken_adi = deger
    
    # sınıf metodları
    def metod_adi(self, parametreler):
        # kodlar

Bu örnek sınıfta SinifAdi adında bir sınıf tanımlanmıştır. degisken_adi adında bir sınıf değişkeni ve metod_adi adında bir sınıf metodu bulunmaktadır. Sınıf metodları, self parametresiyle başlarlar ve sınıfın özelliklerine erişebilirler.

Sınıfların özellikleri, nesnelerin özellikleriyle aynıdır, ancak nesnelerin özellikleri sınıf özelliklerinden farklı değerlere sahip olabilirler. Sınıfların metodları, nesnelerin metodlarıyla aynıdır, ancak nesne metodları sınıf metodlarından farklı davranabilirler.

Sınıflar, başka sınıflardan kalıtım yoluyla türetilebilirler. Kalıtım, bir sınıfın diğer sınıflardan özelliklerini ve metodlarını miras almasına olanak sağlar. Bu, kod tekrarını azaltır ve daha okunaklı ve sürdürülebilir kodlar yazmanıza yardımcı olur.

Örneğin, Araba sınıfından türeyen bir SUV sınıfı şu şekilde tanımlanabilir:

class Araba:
    def __init__(self, marka, model, renk):
        self.marka = marka
        self.model = model
        self.renk = renk
        self.__hiz = 0
    
    def hizlan(self, deger):
        self.__hiz += deger
    
    def yavasla(self, deger):
        self.__hiz -= deger
    
    def dur(self):
        self.__hiz = 0
    
class SUV(Araba):
    def __init__(self, marka, model, renk):
        super().__init__(marka, model, renk)
        self.__bagaj_hacmi = 0
    
    def bagaj_ac(self):
        print("Bagaj açıldı")
    
    def bagaj_kapa(self):
        print("Bagaj kapandı")
    
    def bagaj_hacmi(self, deger):
        self.__bagaj_hacmi = deger

Bu örnekte, Araba sınıfından türeyen bir SUV sınıfı tanımlanmıştır. SUV sınıfı, Araba sınıfının özelliklerini ve metodlarını miras almaktadır. Ayrıca, SUV sınıfının kendi özellikleri ve metodları da vardır. super() fonksiyonu, üst sınıfın metotlarına erişmek için kullanılır.

 

Kalıtım (Inheritance)

Kalıtım, bir sınıfın özelliklerini ve davranışlarını başka bir sınıfa aktarmak için kullanılır. Yani bir sınıf, diğer bir sınıfın tüm özelliklerini ve metodlarını miras alır. Bu sayede kod tekrarını önler, daha az kod yazarak daha fazla işlem yapabiliriz.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def info(self):
        print(f"Name: {self.name}, Age: {self.age}")
        
class Employee(Person):
    def __init__(self, name, age, salary):
        super().__init__(name, age)
        self.salary = salary
        
    def info(self):
        super().info()
        print(f"Salary: {self.salary}")

Yukarıdaki örnekte, Employee sınıfı Person sınıfından kalıtım almaktadır. Employee sınıfında, __init__ metodunu ezerek salary özelliğini eklemiştir. Ayrıca info metodunu da ezerek önce Person sınıfındaki info metodunu çalıştırarak kişisel bilgileri yazdırmış, ardından salary özelliğini yazdırmıştır.

Polimorfizm (Polymorphism)

Polimorfizm, farklı sınıfların aynı metodları farklı şekilde uygulamasıdır. Yani aynı isimde bir metod, farklı sınıflar için farklı işlemler yapar.

class Animal:
    def sound(self):
        pass
        
class Dog(Animal):
    def sound(self):
        print("Woof!")
        
class Cat(Animal):
    def sound(self):
        print("Meow!")

Yukarıdaki örnekte, Animal sınıfından kalıtım alan Dog ve Cat sınıfları, sound metodunu ezerek farklı işlemler yapmaktadır.

Soyutlama (Abstraction)

Soyutlama, bir sınıfın karmaşık özelliklerini gizleyerek kullanımını kolaylaştırır. Bu sayede sınıfın kullanımı daha basit ve anlaşılır hale gelir.

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def sound(self):
        pass
        
class Dog(Animal):
    def sound(self):
        print("Woof!")

Yukarıdaki örnekte, Animal sınıfı soyut bir sınıftır ve sound metodunu soyut olarak tanımlamıştır. Dog sınıfı, Animal sınıfından kalıtım alarak sound metodunu uygulamak zorundadır.

Kapsülleme (Encapsulation)

Kapsülleme, bir sınıfın özelliklerinin ve metodlarının diğer sınıflardan gizlenmesi ve sadece sınıf içinde kullanılabilmesidir. Bu sayede özelliklerin ve metodların yanlışlıkla değiştirilmesi önlenir ve daha güvenli bir kod yazımı sağlanır.

Python'da kapsülleme, özelliklerin başına "__" çift alt çizgi konularak yapılır. Böylece, bu özellikler diğer sınıflardan gizlenir ve sadece sınıf içinde kullanılabilir. Özelliklere erişmek için, sınıf içinde özel metodlar (getter ve setter) kullanılır.

Örneğin, aşağıdaki örnek, "Person" sınıfının "name" ve "age" özelliklerini gizler ve bu özelliklere erişmek için özel metodlar tanımlar:

class Person:
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
        
    def get_name(self):
        return self.__name
        
    def set_name(self, name):
        self.__name = name
        
    def get_age(self):
        return self.__age
        
    def set_age(self, age):
        self.__age = age

Bu sınıfta, "__name" ve "__age" özellikleri, diğer sınıflardan gizlenir. "get_name", "set_name", "get_age" ve "set_age" metodları, bu özelliklere erişmek için kullanılır.

Örneğin, aşağıdaki kod, "Person" sınıfının özelliklerine erişir:

person = Person("John", 25)
print(person.get_name()) # John
person.set_name("Alice")
print(person.get_name()) # Alice

Kapsülleme, bir sınıfın dışarıdan erişilemeyen, gizli verileri (private) ve sınıfın dışından erişilebilen, açık verileri (public) ayırmak için kullanılır. Bu sayede sınıfın dışından erişilemeyen, özellikle gizli verilerin istemci tarafından yanlışlıkla değiştirilmesi veya bozulması engellenir.

Python'da kapsülleme, sınıf özelliklerinin başına çift alt çizgi (__) eklenerek yapılır. Bu şekilde özellikler gizli hale getirilir ve sadece sınıf içinde kullanılabilir hale gelir.

Örnek olarak aşağıdaki kod bloğunda bir Araba sınıfı tanımlanmıştır. Sınıfın içindeki hız özelliği çift alt çizgi ile gizlenmiştir:

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

    def __hizlandir(self):
        self.__hiz += 10

    def __yavaslat(self):
        self.__hiz -= 10

    def bilgileri_goster(self):
        print("Marka:", self.marka)
        print("Model:", self.model)
        print("Hız:", self.__hiz)

    def hizlan(self):
        self.__hizlandir()

    def yavasla(self):
        self.__yavaslat()

Yukarıdaki kodda Araba sınıfı tanımlanmış ve __hiz özelliği çift alt çizgi ile gizlenmiştir. Ayrıca sınıfın içinde __hizlandir ve __yavaslat adında iki tane gizli metod da tanımlanmıştır. Bu metotlar, sadece sınıf içinde kullanılmak üzere tasarlanmıştır.

Bununla birlikte, Araba sınıfının dışında, sınıfın bilgilerini göstermek için bir bilgileri_goster metodu tanımlanmıştır. Bu metot, marka, model ve __hiz özelliklerini ekrana yazdırmaktadır. Ayrıca, hizlan ve yavasla adında iki tane değiştirici metod da tanımlanmıştır. Bu metodlar, __hiz özelliğini değiştirirler.

Ancak, __hiz özelliği çift alt çizgi ile gizlenmiş olduğu için, Araba sınıfının dışında doğrudan bu özelliğe erişilemez. Bu özelliğe erişmek için, Araba sınıfı içinde tanımlanmış olan hizlan ve yavasla metodları kullanılmalı

Bu şekilde sınıfın özellikleri, sınıf dışından korunmuş olur ve sadece sınıfın metodları üzerinden erişilebilir hale gelir. Bu sayede sınıfın iç yapısı dışarıya tam olarak gösterilmemiş olur ve sınıfın koruma altına alınması sağlanır.

Kapsüllemenin bir diğer önemli yararı, sınıfın iç yapısının değiştirilmesi durumunda, sınıfın kullandığı diğer sınıflarda da değişiklik yapmadan sadece sınıfın içindeki değişikliklerin uygulanabilmesidir. Bu sayede sınıfın kullanımı kolaylaşır ve daha esnek hale gelir.

Python'da kapsülleme, özellik ve metodların başına çift alt çizgi (__) konularak yapılır. Ancak, bu özelliklere erişmek tamamen imkansız değildir. Eğer gerçekten bu özelliklere erişmek istenirse, sınıf içinde bu özelliklere özel olarak erişim metodları tanımlanabilir. Örneğin, Araba sınıfında __hiz özelliği için erişim metodları aşağıdaki gibi tanımlanabilir:

class Araba:
    def __init__(self):
        self.__hiz = 0
    
    def hizlan(self, deger):
        self.__hiz += deger
    
    def yavasla(self, deger):
        self.__hiz -= deger
    
    def get_hiz(self):
        return self.__hiz
    
    def set_hiz(self, deger):
        self.__hiz = deger

Bu metodlar sayesinde, sınıf dışından __hiz özelliğine erişilebilir hale gelir. Ancak, bu metodlar sınıfın dışındaki kullanıcıların __hiz özelliğine doğrudan erişiminden daha kontrollü bir erişim sağlar. Örneğin, set_hiz metodunda __hiz özelliğine atanan değerler kontrol edilebilir ve gerekirse uygun hale getirilebilir.

Kapsülleme, nesne yönelimli programlamanın en temel prensiplerinden biridir ve Python'da da bu prensibe büyük önem verilir. Sınıfların iç yapısının korunması ve kullanımının kolaylaştırılması açısından kapsülleme önemli bir rol oynar.

 

class SinifAdi:
    # sınıf değişkenleri
    degisken_adi = deger
    
    # sınıf metodları
    def metod_adi(self, parametreler):
        # kodlar

Bu örnek sınıfta SinifAdi adında bir sınıf tanımlanmıştır. degisken_adi adında bir sınıf değişkeni ve metod_adi adında bir sınıf metodu bulunmaktadır. Sınıf metodları, self parametresiyle başlarlar ve sınıfın özelliklerine erişebilirler.

Sınıfların özellikleri, nesnelerin özellikleriyle aynıdır, ancak nesnelerin özellikleri sınıf özelliklerinden farklı değerlere sahip olabilirler. Sınıfların metodları, nesnelerin metodlarıyla aynıdır, ancak nesne metodları sınıf metodlarından farklı davranabilirler.

Sınıflar, başka sınıflardan kalıtım yoluyla türetilebilirler. Kalıtım, bir sınıfın diğer sınıflardan özelliklerini ve metodlarını miras almasına olanak sağlar. Bu, kod tekrarını azaltır ve daha okunaklı ve sürdürülebilir kodlar yazmanıza yardımcı olur.

Örneğin, Araba sınıfından türeyen bir SUV sınıfı şu şekilde tanımlanabilir:

class Araba:
    def __init__(self, marka, model, renk):
        self.marka = marka
        self.model = model
        self.renk = renk
        self.__hiz = 0
    
    def hizlan(self, deger):
        self.__hiz += deger
    
    def yavasla(self, deger):
        self.__hiz -= deger
    
    def dur(self):
        self.__hiz = 0
    
class SUV(Araba):
    def __init__(self, marka, model, renk):
        super().__init__(marka, model, renk)
        self.__bagaj_hacmi = 0
    
    def bagaj_ac(self):
        print("Bagaj açıldı")
    
    def bagaj_kapa(self):
        print("Bagaj kapandı")
    
    def bagaj_hacmi(self, deger):
        self.__bagaj_hacmi = deger

Bu örnekte, Araba sınıfından türeyen bir SUV sınıfı tanımlanmıştır. SUV sınıfı, Araba sınıfının özelliklerini ve metodlarını miras almaktadır. Ayrıca, SUV sınıfının kendi özellikleri ve metodları da vardır. super() fonksiyonu, üst sınıfın metotlarına erişmek için kullanılır.

Python'da nesne yönelimli programlama, kodun daha modüler ve daha okunaklı hale getirilmesine yardımcı olur. Bu yaklaşım, kodun tekrar kullanılabilirliğini artırır ve daha kolay bakım yapılmasına imkan verir.

Bu makalede, Python'da nesne yönelimli programlama kavramlarına giriş yaptık. Sınıflar, nesneler, kalıtım, çoklu kalıtım, kapsülleme ve çok biçimlilik gibi kavramları öğrendik ve bunları somut örneklerle açıkladık. Bu kavramların anlaşılması, Python'da nesne yönelimli programlama uygulamaları geliştirmeye başlamak için iyi bir temel oluşturur.

Nesne yönelimli programlama kavramlarına hakim olduktan sonra, daha karmaşık programlar yazmak mümkün olacaktır. Ancak, OOP kavramlarının anlaşılması bir süreç gerektirir ve bu süreçte sabırlı ve azimli olmak gerekir. Daha fazla bilgi edinmek için, Python resmi belgelerindeki OOP bölümlerini okuyabilir veya OOP konusunda diğer kaynakları inceleyebilirsiniz.

Aykhan Gasimzade Aykhan Gasimzade verified icon
Full Stack Developer

Merhaba! Ben Aykhan, 1999 doğumlu bir Azerbaycanlıyım ve 2017 yılından bu yana programlamayla ilgileniyorum. Teknolojinin büyülü dünyası beni her zaman etkilemiştir ve bu merakımı kendi blogumda paylaşarak daha geniş bir kitleyle buluşturmayı amaçlıyorum.