Bloga başlamadan önce temel bir bilgi olması açısından aşağıda linkini verdiğim blogu okumanız gerekir.
Nesne Yönelimli Programlama (OOP) Nedir?
Yukarıdaki blog içerisinde de anlattığım üzere OOP yapılarında bir nesneyi baz alıyoruz. Örneğin bir araba nesnesini düşünebiliriz. Birden fazla araba markası vardır ve genel anlamda bu markaların özellikleri birbirinden farklıdır. Örneğin iki arabada da gaz pedalı vardır ama hızları aynı değildir; iki arabada da akıllı sistemler vardır ama birinin sistemi diğerinden daha niteliklidir. İşte, ortak yapılara ancak farklı özelliklere sahip nesneleri class yapıları ile, OOP mantığına göre kodluyoruz. Bu sayede yazacağımız kodlar hem daha kısa hem de daha verimli yapılara dönüşüyor.
Konunun derinliklerine indikçe bu dediklerimi daha net anlayacaksınızdır. O yüzden direkt olarak konumuza başlayalım. Şimdi, bilgisayar nesnesi (class) oluşturacağım.

Dikkat edelim. class anahtar kelimesini girdikten sonra bu sınıfa bir isim veriyoruz (Computer). Verdiğimiz ismin ilk harfi ise büyük yazılmalıdır.
def computer():
Yukarıdaki ifadede gördüğünüz gibi def anahtar kelimesinden sonra bu fonksiyona bir isim veriyor ve iki nokta üst üste koyup girintili bir şekilde aşağı iniyorduk. Aynı şekilde class dedikten sonra bir isim veriyoruz ve iki nokta üst üste koyup aşağı iniyoruz. Ancak burada parantez söz konusu değildir. Yukarıdaki ekranda gördüğünüz şekilde tanımlıyoruz.
Şimdi, bir nesnenin "temel olarak" nasıl tanımlandığına bakalım.

pc1 = Computer() dedim ve pc1 isimli bir nesnem olmuş oldu. Aynı işlemleri pc2 için de yaptık ve pc2 isimli bir başka nesnemiz daha olmuş oldu. Şu an iki adet nesnemiz var. Peki, madem nesnemiz var; o zaman bu nesnelere özellik veremez miyiz? Örneğin pc1 nesnesinin markasını, depolama kapasitesini vesaire tanımlayabiliriz. Bakalım.

pc1. dedikten sonra bir değişken tanımlar gibi özellik ismi tanımlıyoruz. pc1.brand derken aslında "pc1 isimli nesnenin markası" demiş oluyoruz. pc1.brand bir bütün olduktan sonra klasik değer atama işlemimizi yapıyoruz ve son yapı şu şekilde oluyor: pc1.brand = "DELL".
Artık pc1 isimli nesnenin markası mevcut. Dilediğiniz kadar özellik ekleyebilirsiniz; örneğin RAM kapasitesini de yazabilirsiniz. Aynı işlemleri pc2 için de yaptık. Eğer pc3 isimli bir nesne daha yaratmak istiyorsanız ilk önce o nesneyi tanımlamanız, sonrasında o nesneye özellikler vermeniz lazım. Yani aşağıdaki gibi bir kullanım sağlamanız gerekir.
pc3 = Computer()
pc3.brand = "ASUS"
...

Sonrasında, yukarıdaki gibi ekrana yazdırma işlemlerini de yapabilirsiniz.
Buraya kadar her şey güzel ama takdir edersiniz ki bu yöntem oldukça karışık, anlaması ve ayıklaması zor bir yöntem olabilir. İşte tam olarak bu noktada devreye class yapısı giriyor. Şimdi, biraz önce tanımladığım her şeyi siliyorum, class içerisine geliyorum ve özel bir fonksiyon tanımlıyorum.

def __init__(self): tarzında bir fonksiyon görüyorsunuz. Bu, seri boyunca ilk defa gördüğünüz bir metot olduğu için daha sade bir anlatım sunacağım. Ancak öğrenmemiz gereken ilk şey şudur: "class içerisine tanımlanan fonksiyonlar artık fonksiyon olarak değil, metot olarak adlandırılır".
Şimdi, bir adet init metodumuz mevcut. "init" kelimesi "initialize" kelimesinin kısaltılmışıdır ve anlamı "başlatmak" şeklindedir. Biz bu metodu verdiğimiz zaman aslında class içerisinde, birazdan tanımlayacağımız özellikleri başlatmış oluyoruz. Yani her şeyin başlangıcı yukarıda gördüğünüz __init__ metodudur.
Parantezler arasında bulunan "self" ifadesi ise __init__ ile başlattığımız ve biraz sonra tanımlayacağımız özelliklere erişmemize olanak tanır. Ayrıca self, o an hangi nesne oluşturuluyor veya çağırılıyorsa onunla ilişkilendirilecektir. Biraz önce pc1.brand derken aslında pc1 nesnesinin özelliğine eriştik. Burada da self.brand diyeceğiz ve __init__ ile başlatılan bu özellik, self ile çağırılabilir durumda olacak. Yani her bir nesne oluşturduğumuzda self parametresi bunu alacak, ve nesne ile self parametresi ilişkilendirilecek.
Peki, özellikleri nasıl tanımlayacağız?

Biraz önce teker teker tanımladığımız özellikleri __init__ metodunun parantezlerinin arasına yazıyoruz. Bu noktada yine istediğiniz bir özelliği ekleyebilir ya da çıkarabilirsiniz. Şimdi, yazdığımız bu özellikleri tanımlamak zorundayız. Bunun için self ifadesini kullanacağız.

Bunu yaparken self.<değişken adı> = <init metoduna verdiğimiz ifade> şeklinde bir kullanım sergiliyoruz. Yani self.brand = brand diyoruz ve brand ifadesi artık tanımlanmış oluyor. Dikkat ettiyseniz, biraz önce renkleri soluk iken şimdi renkleri canlandı.
Şimdi, biraz önceki gibi bir nesne oluşturalım; pc1.Computer() ve değer atamalarını gerçekleştirelim.

Okların renklerini takip edebilirsiniz. Biraz önce __init__ içerisine verdiğimiz ifadelerin değerlerini, pc1.Computer() yapısına koyduk. Bu yapı, biraz önceki yapıyla aynı işi yapıyor ama hem esneklik açısından hem de görünürlük açısından daha güzel olduğunu söyleyebilirim. Zaten önceki kullanım yerine bu kullanım tercih edilir. Konu ilerledikçe avantajlarını göreceksiniz.
Bir özellik çağırmayı deneyelim.

Gördüğünüz üzere pc1. dedikten sonra karşıma, kullanabileceğim özellikleri çıkardı. Bu noktada istediğiniz özelliği yazdırabilirsiniz. Örneğin;

Peki, şu ana kadar her şey güzel. Şimdi, __init__ haricinde bir metot oluşturup oluşturamayacağımıza bir bakalım.

def brands(self): şeklinde bir metot tanımladık ve içerisine, çağırılan nesnenin markasını döndürecek olan kodu yazdık. Aşağı bakarsanız artık pc1.brand şeklinde direkt olarak nesnenin özelliğini çağırmak yerine, pc1.brands() diyerek nesneye özgü fonksiyonu çağırdık. Yani burada şunu demiş olduk: "pc1 nesnesi için brands() fonksiyonunu çalıştır". Eğer pc1.brands() demek yerine pc2.brands() deseydik bu defa pc2 isimli nesnenin markasını döndürecekti. Bununla ilgili bir örnek daha yapalım.
Bunun için, çağırılan nesneye ait SSD ve HDD bilgilerini verecek olan bir metot daha tanımlıyorum.

def ssdAndhdd(self): dedim ve yine return ile SSD ve HDD bilgisini döndürdüm. Sonrasında pc1.ssdAndhdd() ve pc2.ssdAndhdd() diyerek iki nesnenin de özelliklerini istedim.
Bu noktada, çıktının pek de güzel göründüğünü söyleyemem. Bunun için çeşitli şekillerde düzenlemeler yapabilirsiniz. Örneğin;

SSD ve HDD bilgisini döndüren fonksiyonu çağırırken aynı zamanda marka bilgisini döndüren fonksiyonu çağırdım. Bu sayede çıktı daha tatlı bir şekilde geldi.
Dikkat ettiyseniz class içerisine tanımladığımız metotlar da self parametresini alıyor. Bu detayı kaçırmayalım. Dikkat etmeniz gereken diğer yapılara bakalım.
pc1 = Computer(...) şeklinde tanımladığımız nesneleri class içerisine tanımlamıyoruz. Bakalım.

Girinti sistemini kırmızı düz çizgi ile belirttim. Tanımladığımız nesneleri class yapısının içine koyduğumuzda altının çizileceğini, hata alacağınızı görebilirsiniz.
Dikkat etmeniz gereken başka bir şey daha var; tanımlama sırası.

Okların renklerini takip etmeniz gerektiğini blogun önceki kısımlarında zaten söyledim. Eğer __init__ içerisine verdiğiniz brand özelliğini, nesne tanımlarken başka bir konuma koyarsanız kodunuz yine çalışacaktır ama yanlış çalışacaktır. Basitçe ne demek istediğimi göstereyim.

brand özelliğini __init__ metodu içerisinde en başa yazdım ama pc1 nesnesini tanımlarken marka özelliğini en başa koymadım. Bu noktada brand özelliği yine çalışacaktır ama yanlış sonuç üretecektir. brand özelliğinin değeri "DELL" olması gerekirken çıktı ekranında "i5 9" ifadesini görüyorsunuz.
Siz de kendinize bir class yapısı oluşturup bu yapıyı sürekli kurcalayın; deneyin, yanılın, görün, anlayın. İkinci bölümde görüşmek üzere.
Yayınlanma Tarihi: 2022-12-22 14:39:52
Son Düzenleme Tarihi: 2022-12-27 10:49:41