Nesne Tabanlı Programlama -4- (OOP)

Gökhan YAVAŞ
gokhanyavas
Published in
2 min readDec 17, 2016

Nesne Tabanlı Programlamaya yönelik son yazımda Çok biçimlilik ve sınıflara ait ileri düzey konudan bahsedeceğim.

Çok Biçimlilik (Polymorphism)

Nesneye yönelik programlamanın en önemli özelliklerinden biri de çok biçimliliktir. Çok biçimlilik, bir sınıf içinde aynı isimde fakat farklı içerikte metotlar kullanabilme özelliğidir. Çok biçimlilik, aynı metodun değişik sınıflar içinde yer alabilme imkanıdır.

Çok Biçimliliği daha iyi anlamak için örneği inceleyin:

class Hayvanlar:
def __init__(self, isim):
self.isim = isim
def tepki(self):
raise NotImplementedError('HATA')
class Kedi(Hayvanlar):
def tepki(self):
return 'Miyav!'
class Kopek(Hayvanlar):
def tepki(self):
return 'Haav! Hav!'
hayvan = [Kedi('Boncuk'),
Kedi('Tekir'),
Kopek('Elmas')]
for hyvn in hayvan:
print(hyvn.isim + ': ' + hyvn.tepki())
Tepki fonksiyonun burada çok biçimli olarak kullanıldığına dikkat edin. Aynı tanımda belirttiğimiz gibi değil mi? Evet dediğinizi duyar gibiyim bu yüzden daha fazla lafı uzatmayacağım...
Python'da bir sınıfın ömrü 3 aşamadan oluşur:
  • İnşa (Construction)
  • İlklendirme (Initialization)
  • Sonlardırma (Destruction)
Python'da bir sınıfı ilklendirmek için __init__() isimli metottan yararlandığımızı biliyorsunuz. Python, bir sınıfı ilklendirmeden önce inşa eder. Bu inşa işlemini yapan metotun adı __new__() 'dir. Metodu yakından inceleyelim:__new__() Metodu
Yukarıda belirttiğimiz gibi sınıf örneklendiğinde çalışan metot __init__() değil __new__()'dir. Kanıtlayalım:
class Ornek_Sınıf():
def __new__(cls):
pass
def __init__(self):
print('merhaba')
Bu sınıfı örneklediğinizde, ekrana merhaba yazmaz çünkü Python'da ön tanımlı __new__() metodunu yazıp işlevselliğini ortadan kaldırmış olmanızdır.Bir sınıfın, inşa edilme sürecinin nasıl işleyeceğini kontrol etmek isterseniz aşağıdaki yöntemi kullanabilirsiniz:class Ornek_Sınıf():
def __new__(cls, *args, **kwargs):
print('lütfen bekleyiniz... Sınıf inşa ediliyor...')
return object.__new__(cls, *args, **kwargs)
def __init__(self):
print('merhaba')
__new__() metodun da yaptığımız aslında basit bir miras alma işlemi. Bir önceki konumuzda bahsettiğimiz gibi Python'da bütün sınıflar, eğer başka bir sınıfı miras almıyorlarsa, otomatik olarak object sınıfını miras alırlar.
Sınıfı test etmek isterseniz her zaman yaptığımız gibi içeri aktarıp... :import Ornek
snf = Ornek.Ornek_Sınıf()
Cıktı:
lütfen bekleyiniz... Sınıf inşa ediliyor...
merhaba
Konumuzu bitirmeden önce __new__() metotunu kullanarak yapacağınız pek çok işi doğrudan __init__() metotu ile yapabilirsiniz. Ama ben fantezi severim diyorsanız buyrun klavye sizde. İyi bakın kendinize :)

--

--