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.
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.