Python ile 5 Dakikada Nesneye Yönelik Programlama
Tags: python, oop, datascience
Published: 2020-10-14 16:03:21

Sınıflar sadece `python`'da değil diğer programlama dillerinde de işimizi oldukça kolaylaştıran yapılardır. Python'da oluşturduğumuz her int, str, list gibi yapılar aslında sınıf olarak oluşturulmaktadır. Temel olarak sınıflar birden fazla özelliği, metodu kendi içerisinde barındıran şablonlardır diyebiliriz.

- **Sınıf(class) oluşturma**

```python
class BenimSinif():
    ozellik1 = ""
    programlamaDili = "Python"
```

- **Sınıftan örnek(instance) oluşturma**

```python
ornekOlustur = BenimSinif()

# örnek oluşturulan sinifin özelliğine
ornekOlustur.ozellik1 # şeklinde ulaşabiliriz.
```

- **Sınıflarda kurucu(constructor) fonksiyon oluşturma**

**`__init__`** ile başlayan ifade aslında oluşturduğumuz örneklere(instance) göre özellikler tanımlamamız için gereklidir. İçerisinde `self.` ile sadece örneklere özgü özellikler tanımlayabiliyoruz.

```python
class BenimSinifim():
    sinifOzelligi = [] # genel özellik
    def __init__(self):
        self.isim = ""
        self.bolum = ""

# sinifimizin özelliğine erişme
ornekSinif = BenimSinifim()
ornekSinif.isim = "Eydi" # şeklinde atama yapılabilir.

# genel özelliğe erişmek için
BenimSinifim.sinifOzelligi.append("Eydi") # şeklinde atama yapılabilir.
BenimSinifim.sinifOzelligi

# Not: Bu şekilde atama yapıldığında oluşturulan örneklerden(instance) 
# atama yapılmamış(varsayılan) olanlarda değiştirilebilir.
```

- **Farklı bir metod oluşturarak atama yapma**

Sınıflarda çoğu zaman enkapsülasyon yapmamız gerekiyor. Genel özelliklerin dışında, her oluşturulan örneğin(instance) metod ile kendine ait özelliklerini değiştiririz.

>**Not:** **`_isim`** şeklinde yazılan değişkeni **`isim`** şeklinde de yazabilirdim. Aslında tanımlanan metoda ait yerel değişken oluyor. Çok fazla kafa karışıklığına yol açmamak için bu şekilde kullandım.

```python
class BenimSinifim():
    def __init__(self):
        self.isim = ""
    def isimYazdir(self, _isim):
        self.isim = _isim

# oluşturduğumuz sınıftan örnek(instance) oluşturarak
ornekSinif = BenimSinifim()
ornekSinif.isimYazdir("Eydi")
ornekSinif.isim # denilerek ekran da kendi isminizi yazdırabilirsiniz.
```

- **Kurucu(constructor) fonksiyon ile atama yapma**

En başında örneği(instance) oluştururken tanımlama yapabiliriz.

```python
class Calisanlar(): # miras alınmıyorsa parantez kullanmayabiliriz.
    def __init__(self, isim, soyIsim):
        self.isim = isim
        self.soyIsim = soyIsim

# şimdi instance(örnek) oluşturalım.
eydi = Calisanlar("eydi", "gözeneli")
eydi.isim # Çıktı da 'eydi' yazacaktır.
eydi.soyIsim # Sizde kendi isminizi deneyebilirsiniz.
```

- **Kalıtım(Inheritance), Miras alma(Inherit)**

Şöyle düşünelim: Ortak özelliklere sahip bir topluluğumuz var. Örneğin; bir üniversite de akademisyen ve öğrencilerden oluşan bir topluluk. Ortak özellikleri ve kendilerine ait özellikleri bulunacaktır. Böyle bir durumda her birini tek tek tanımlamak yerine ortak özellikler bir kere tanımlanır. Geriye kalan özellikler kendi içlerinde tanımlanır. Nedir bu ortak özellikler? İsim, yaş, vb. özelliklerden bahsedebiliriz. Kod örneğiyle açıklayalım.

```python
class Kisiler():
    def __init__(self, isim, soyIsim):
        self.isim = isim
        self.soyIsim = soyIsim

class Akademisyen(Kisiler): # kalıtım alıyoruz
    def __init__(self, isim, soyIsim,bolum):
        super().__init__(isim, soyIsim) # üst sınıftaki kurucu metoddan
# önceki tanımlamalarımızı çekiyoruz
        self.bolum = bolum # bu sınıfa özgü özellik
        
class Ogrenci(Kisiler):
    def __init__(self, isim, soyIsim, sinif):
        super().__init__(isim, soyIsim) # super() Ogrenci sınıfı içinde
# kullanılıyor
        self.sinif = sinif

eydi = Akademisyen("eydi", "gözeneli", "mekatronik")
eydi.bolum
eydi.isim

esma = Ogrenci("esma", "gözeneli", "4. sinif")
esma.isim
esma.sinif
```

>**Not:** **`super().__init__(...)`** **metodu** ile üst sınıfımızdaki kurucu(constructor) fonksiyonumuzdaki eşitlikleri tekrar **üstüne yazmamıza(override)** gerek kalmadan sınıfımıza dahil ediyoruz.