
1. Python’da def __init__() Metodu
Python’da sınıflar, daha önce de belirtildiği gibi nesnelerin belirli özellikler ve metotlarla oluşturulması için kullanılan genelleştirilmiş yinelenebilir koleksiyonlardır. Önceki makalede yer alan örnekler gerçek bir uygulamada kullanışlı olmayabilir. Özellikle de sınıfın ya da kodların okunabilirliğinin arttırılması bakımından “init” (initialize, başlatmak) metodu kullanılır. “init” metodu, ait olduğu sınıfa ilişkin veri yapısı hakkında çok hızlı bir fikir verir. Diğer bir ifadeyle Python’da “init” metodu, sınıfınıza ilişkin verilerinizi basit ve okunabilir bir şekilde yapılandırmanızı sağlar. Aşağıdaki sınıf örneğini, çalıştırdıktan sonra incelemeniz önerilir.
#Init Metotlu Sınıf (class)
class myFamily:
# init metodu ya da yapılandırıcı (constructor)
#init içinde fname, lname, age, height, weight olmak üzere beş değişken tanımlanmıştır.
#Bu değişkenleri sınıfın içinde ya da dışında kolaylıkla kullanabilirsiniz.
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
f1 = myFamily("İshak", "Kutlu", "37", "1.80", "90") #f1 ifadesi "init metodu içindeki değişkenler belirtilerek" myFamily sınıfına üye yapıldı. Üyelik koşulu gibi düşünebilirsiniz.
#f1 = myFamily() #Üyelik koşullarını belirtmeden myFamily sınıfını kullanamazsınız. Sonuç: TypeError: __init__() missing 5 required positional arguments: 'fname', 'lname', 'age', 'height', and 'weight'
f2 = myFamily("Zeliha", "Kutlu", "36", "1.65", "60")
f3 = myFamily("Elif Mira", "Kutlu", "4", "1.07", "20")
print("___________\n")
f1.Listele() #Yukarıda f1, myFamily sınıfına üye yapıldığı için sınıfın Listele metodunu kullanabilir.
#Sonuç:
"""
İsim: İshak
Soy İsim: Kutlu
Yaş: 37
Boy: 1.80
Kilo: 90
"""
print("___________\n")
f2.Listele()
#Sonuç:
"""
İsim: Zeliha
Soy İsim: Kutlu
Yaş: 36
Boy: 1.65
Kilo: 60
"""
print("___________\n")
f3.Listele()
#Sonuç:
"""
İsim: Elif Mira
Soy İsim: Kutlu
Yaş: 4
Boy: 1.07
Kilo: 20
"""
print("___________BELİRLİ BİR VERİYİ ÇAĞIRMAK\n")
#Aşağıdaki yöntemle de belirli bir veriyi çağırabiliriz. Tabi ki myFamily sınıfına üye bir nesne için bu özellikleri kullanabilirsiniz.
print("Ad:", f1.fname) #Sonuç: Ad: İshak
print("Soyad:", f1.lname) #Sonuç: Soyad: Kutlu
print("Ağırlık:", f1.weight) #Sonuç: Ağırlık: 90
print("___________\n")
print("Ad:", f2.fname) #Sonuç: Ad: Zeliha
print("Soyad:", f2.lname) #Sonuç: Soyad: Kutlu
print("Boy:", f2.height) #Sonuç: Boy: 1.65
print("___________\n")
print("Ad:", f3.fname) #Sonuç: Ad: Elif Mira
print("Soyad:", f3.lname) #Sonuç: Soyad: Kutlu
print("Yaş:", f3.age) #Sonuç: Yaş: 4
Yukarıdaki örneği Listele metodunun içindeki “İsim:”, “Soy İsim:” gibi string ifadeleri sınıfın özelliği yaparak şu şekilde de ifade edebiliriz.
#Init Metotlu Sınıf (class)
class myFamily:
#BU KISIM İLAVE EDİLDİ
StrIsim = "İsim"
StrSoyIsim = "Soy İsim"
StrAge = "Yaş"
StrHeight = "Boy"
StrWeight = "Kilo"
# init metodu ya da yapılandırıcı (constructor)
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrIsim + ": " + self.fname, self.StrSoyIsim + ": " + self.lname, self.StrAge + ": " + self.age, self.StrHeight + ": " + self.height, self.StrWeight + ": " + self.weight)
#print(x)
for a in x:
print(a)
f1 = myFamily("İshak", "Kutlu", "37", "1.80", "90")
f2 = myFamily("Zeliha", "Kutlu", "36", "1.65", "60")
f3 = myFamily("Elif Mira", "Kutlu", "4", "1.07", "20")
print("___________\n")
f1.Listele()
#Sonuç:
"""
İsim: İshak
Soy İsim: Kutlu
Yaş: 37
Boy: 1.80
Kilo: 90
"""
print("___________\n")
f2.Listele()
#Sonuç:
"""
İsim: Zeliha
Soy İsim: Kutlu
Yaş: 36
Boy: 1.65
Kilo: 60
"""
print("___________\n")
f3.Listele()
#Sonuç:
"""
İsim: Elif Mira
Soy İsim: Kutlu
Yaş: 4
Boy: 1.07
Kilo: 20
"""
print("___________BELİRLİ BİR VERİYİ ÇAĞIRMAK\n")
#Aşağıdaki yöntemle de belirli bir veriyi çağırabiliriz.
print("Ad:", f1.fname) #Sonuç: Ad: İshak
print("Soyad:", f1.lname) #Sonuç: Soyad: Kutlu
print("Ağırlık:", f1.weight) #Sonuç: Ağırlık: 90
print("___________\n")
print("Ad:", f2.fname) #Sonuç: Ad: Zeliha
print("Soyad:", f2.lname) #Sonuç: Soyad: Kutlu
print("Boy:", f2.height) #Sonuç: Boy: 1.65
print("___________\n")
print("Ad:", f3.fname) #Sonuç: Ad: Elif Mira
print("Soyad:", f3.lname) #Sonuç: Soyad: Kutlu
print("Yaş:", f3.age) #Sonuç: Yaş: 4
Dilerseniz ad soyad, yaş, boy, kilo gibi tüm parametreleri “Listele” metodunda kullanmak yerine aşağıda gösterildiği gibi farklı metotlara dağıtarak da kullanabilirsiniz.
#Init Metotlu Sınıf (class)
class myFamily:
StrIsim = "İsim"
StrSoyIsim = "Soy İsim"
StrAge = "Yaş"
StrHeight = "Boy"
StrWeight = "Kilo"
# init metodu ya da yapılandırıcı (constructor)
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def ListeleAdSoyad(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrIsim + ": " + self.fname, self.StrSoyIsim + ": " + self.lname)
#print(x)
for a in x:
print(a)
def ListeleYas(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrAge + ": " + self.age)
print(x)
def ListeleKiloBoy(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrHeight + ": " + self.height, self.StrWeight + ": " + self.weight)
#print(x)
for a in x:
print(a)
f1 = myFamily("İshak", "Kutlu", "37", "1.80", "90")
#f1 nesnesini farklı metotlar ile de kullanabilirsiniz.
f1.ListeleAdSoyad()
#Sonuç:
#İsim: İshak
#Soy İsim: Kutlu
f1.ListeleYas()
#Sonuç:
#Yaş: 37
f1.ListeleKiloBoy()
#Sonuç:
#Boy: 1.80
#Kilo: 90
Özetle init metodunu sınıf içinde kullanmak zorunlu değildir. Ancak bir sınıfın veri yapısını ve ona üyelik koşullarını belirlediği için kodların okunabilirliğini ve kontrolünü arttırdığı söylenebilir.
2. Python’da “self” Parametresini Anlamak
Python’da fonksiyonların ilk ve zorunlu parametresi “self”dir. “self” parametresi yardımıyla fonksiyon içinde özellik atama yapabilirsiniz. Yukarıdaki örnekte yer alan “Listele” metodu incelendiğinde “self.StrIsim“, “self.fname” gibi ifadeler, “Listele” metodu içinde StrIsim değerini ya da “fname” değişkenini kullanabilmemize olanak tanır. Elbette ilk parametrenin ismi “self” yerine sizin belirlediğiniz “myParameter” gibi bir isim de olabilir. Bu durumda o metot içinde “self.StrIsim“, “self.fname” gibi ifadeler yerine “myParameter.StrIsim“, “myParameter.fname” gibi ifadeler kullanmak zorundasınız. Özetle Python “self” parametresi (ya da onun yerine geçebilecek bir ilk parametre) kullanmadan bir fonksiyonu/metodu oluşturmamıza izin vermeyecektir.
#Init Metotlu Sınıf (class)
class myFamily:
StrIsim = "İsim"
StrSoyIsim = "Soy İsim"
StrAge = "Yaş"
StrHeight = "Boy"
StrWeight = "Kilo"
# init metodu ya da yapılandırıcı (constructor)
def __init__(myParameter, fname, lname, age, height, weight):
myParameter.fname = fname
myParameter.lname = lname
myParameter.age = age
myParameter.height = height
myParameter.weight = weight
#Liste oluşturucu metot
def Listele(myParameter):
x = (myParameter.StrIsim + ": " + myParameter.fname, myParameter.StrSoyIsim + ": " + myParameter.lname, myParameter.StrAge + ": " + myParameter.age, myParameter.StrHeight + ": " + myParameter.height, myParameter.StrWeight + ": " + myParameter.weight)
#print(x)
for a in x:
print(a)
f1 = myFamily("İshak", "Kutlu", "37", "1.80", "90")
f1.Listele()
#Sonuç:
"""
İsim: İshak
Soy İsim: Kutlu
Yaş: 37
Boy: 1.80
Kilo: 90
"""
3. Python’da Nesne Manipülasyonu
Python’da bir sınıfın üyesi nesnelerin özellikleri (sınıfların özellikleri değil) değiştirilebilir ve silinebilir.
#Init Metotlu Sınıf (class)
class myFamily:
StrIsim = "İsim"
StrSoyIsim = "Soy İsim"
StrAge = "Yaş"
StrHeight = "Boy"
StrWeight = "Kilo"
# init metodu ya da yapılandırıcı (constructor)
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def ListeleAdSoyad(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrIsim + ": " + self.fname, self.StrSoyIsim + ": " + self.lname)
#print(x)
for a in x:
print(a)
def ListeleYas(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrAge + ": " + self.age)
print(x)
def ListeleKiloBoy(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrHeight + ": " + self.height, self.StrWeight + ": " + self.weight)
#print(x)
for a in x:
print(a)
f1 = myFamily("a", "b", "c", "d", "e") #f1 nesnesinin sınıfa üye yapılması amacıyla rastgele değerler atandı.
f1.ListeleAdSoyad()
#Sonuç:
#İsim: a
#Soy İsim: b
#f1 nesnesinin özelliklerinin değiştirilmesi
f1.fname = "İshak" #f1 nesnesinin fname değeri "a" değil "İshak" oldu.
f1.lname = "Kutlu" #f1 nesnesinin lname değeri "b" değil "Kutlu" oldu.
f1.ListeleAdSoyad()
#Sonuç:
#İsim: İshak
#Soy İsim: Kutlu
#f1 nesnesinin lname özelliğinin silinmesi
print(f1.lname)
del f1.lname
#print(f1.lname) #AttributeError: 'myFamily' object has no attribute 'lname'
#Başka bir nesne için fname özelliği halen kullanılabilir. Sadece f1 nesnesi için fname özelliği kaldırılmış oldu.
f2 = myFamily("a", "b", "c", "d", "e")
print(f2.lname) #Sonuç: b
Ayrıca nesnenin kendisi de silinebilir.
#Init Metotlu Sınıf (class)
class myFamily:
StrIsim = "İsim"
StrSoyIsim = "Soy İsim"
StrAge = "Yaş"
StrHeight = "Boy"
StrWeight = "Kilo"
# init metodu ya da yapılandırıcı (constructor)
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def ListeleAdSoyad(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrIsim + ": " + self.fname, self.StrSoyIsim + ": " + self.lname)
#print(x)
for a in x:
print(a)
def ListeleYas(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrAge + ": " + self.age)
print(x)
def ListeleKiloBoy(self):
#BU KISIM YENİDEN DÜZENLENDİ
x = (self.StrHeight + ": " + self.height, self.StrWeight + ": " + self.weight)
#print(x)
for a in x:
print(a)
f1 = myFamily("a", "b", "c", "d", "e") #f1 nesnesinin sınıfa üye yapılması amacıyla rastgele değerler atandı.
#f1 nesnesinin kendisinin silinmesi
del f1
try: f1
except NameError: f1 = None
if f1 is None:
print("f1 nesnesi artık yok.") #Sonuç: f1 nesnesi artık yok.
else:
print("f1 nesnesi var.")
Not: Python’da sınıfların içinde kod bulunmak zorundadır. Bir sınıfın boş olması durumda Python hata verir. Herhangi bir sebeple bir sınıfın içinde kod bulunmuyor ve Python’un da hata vermesi istenmiyorsa sınıfın içine “pass” ifadesi ilave edilebilir.
#pass kullanımı
class myFamily:
pass
4. Python’da İç İçe Sınıflar Kullanmak (inheritance)
Python’da bir sınıf diğer bir sınıfın tüm özelliklerini ve metotlarını kullanılabilir. Metotlarını ve özelliklerini diğer bir sınıftan alan sınıf yavru/alt (child), diğeri ise ana/esas (parent) sınıf olarak adlandırılabilir. Aşağıdaki gibi örnek bir esas sınıfımız olsun.
class myFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
f1 = myFamily("İshak", "Kutlu", "37", "1.80", "90")
f1.Listele()
Aşağıda myFamily sınıfının özelliklerini ve metodunu kullanan myChild isimli bir alt sınıf tanımlanmıştır.
class MyFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
class MyChild(MyFamily): #Ana sınıfı, MyChild isimli sınıftan sonra parantez içinde belirtiyoruz.
pass
f1 = MyChild("Elif Mira", "Kutlu", "4", "1.07", "20") #f1 nesnesinin myChild sınıfının üyesi olduğuna dikkat edin.
f1.Listele() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin.
#Sonuç:
"""
İsim: Elif Mira
Soy İsim: Kutlu
Yaş: 4
Boy: 1.07
Kilo: 20
"""
“MyChild” sınıfının içinde bir “init” metodu tanımlanırsa, artık “MyFamily” sınıfının hiçbir metodunu kullanamaz. Neden? Hatırlanacağı üzere init metodu bir sınıfın veri yapısını, üye olma koşullarını belirlemekteydi. Bu yüzden her ne kadar “MyChild” sınıfı “MyFamily” sınıfının alt sınıfı olsa da kendi veri yapısını deklare ettiği için “MyFamily” sınıfının özelliklerini ve metotlarını kullanamaz.
class MyFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
class MyChild(MyFamily): #Ana sınıfı, MyChild isimli sınıftan sonra parantez içinde belirtiyoruz.
def __init__(self, fname, lname, age, height, weight):
pass
f1 = MyChild("Elif Mira", "Kutlu", "4", "1.07", "20") #f1 nesnesinin myChild sınıfının üyesi olduğuna dikkat edin.
#MyChild sınıfının kendi init metodunu tanımladığımız için artık MyFamily sınıfının init metodunu kullanmıyor.
#Dolayısıyla MyFamily sınıfının metotlarını kullanamaz. Bu yüzden aşağıdaki satırda bir hata oluşacaktır.
f1.Listele() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin. Sonuç: AttributeError: 'MyChild' object has no attribute 'fname'
Ancak “MyChild” sınıfının (alt sınıfın) init metodu içinde “MyFamily” sınıfının (ana sınıfın) init metodunu çağırarak alt sınıfı ana sınıfın init metoduna tekrar bağlayabiliriz.
class MyFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
class MyChild(MyFamily): #Ana sınıfı, MyChild isimli sınıftan sonra parantez içinde belirtiyoruz.
def __init__(self, fname, lname, age, height, weight):
MyFamily.__init__(self, fname, lname, age, height, weight) #Ana sınıfın init metodunu alt sınıfın init metodunun içine yuvalandırdık.
f1 = MyChild("Elif Mira", "Kutlu", "4", "1.07", "20") #f1 nesnesinin myChild sınıfının üyesi olduğuna dikkat edin.
#MyChild sınıfının kendi init metodu içine MyFamily sınıfının init metodunu yuvalandırdığımız için ana sınıfın init metodunu tekrar kullanabiliriz.
f1.Listele() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin.
Eğer “MyChild” sınıfının (alt sınıfın) init metodu içinde “MyFamily” sınıfının (ana sınıfın) init metodunu “super” fonksiyon ile konumlandırırsak, alt sınıf, ana sınıfın tüm metotlarını tekrar kullanabilir.
class MyFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
class MyChild(MyFamily): #Ana sınıfı, MyChild isimli sınıftan sonra parantez içinde belirtiyoruz.
def __init__(self, fname, lname, age, height, weight):
super().__init__(fname, lname, age, height, weight) #Ana sınıfın init metodunu alt sınıfın init metodunun içine "super" metodu ile yuvalandırdık.
#Not: super metot kullanılırken "self" parametresinin kullanılmadığına dikkat edin.
f1 = MyChild("Elif Mira", "Kutlu", "4", "1.07", "20") #f1 nesnesinin myChild sınıfının üyesi olduğuna dikkat edin.
#MyChild sınıfının kendi init metodu içine MyFamily sınıfının init metodunu "super" metot ile yuvalandırdığımız için ana sınıfın tüm metotlarını tekrar kullanabiliriz.
f1.Listele() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin.
#Sonuç:
"""
İsim: Elif Mira
Soy İsim: Kutlu
Yaş: 4
Boy: 1.07
Kilo: 20
"""
“MyChild” sınıfının (alt sınıfın) init metodu içine yeni bir özellik ekleyebiliriz.
class MyFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
class MyChild(MyFamily): #Ana sınıfı, MyChild isimli sınıftan sonra parantez içinde belirtiyoruz.
def __init__(self, fname, lname, age, height, weight):
super().__init__(fname, lname, age, height, weight) #Ana sınıfın init metodunu alt sınıfın init metodunun içine "super" metodu ile yuvalandırdık.
#Not: super metot kullanılırken "self" parametresinin kullanılmadığına dikkat edin.
self.DateofBirth = 2018
f1 = MyChild("Elif Mira", "Kutlu", "4", "1.07", "20") #f1 nesnesinin myChild sınıfının üyesi olduğuna dikkat edin.
f1.Listele() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin.
print(f1.DateofBirth) #Kullanılan özelliğin alt sınıfa ait olduğuna dikkat edin.
#Sonuç:
"""
İsim: Elif Mira
Soy İsim: Kutlu
Yaş: 4
Boy: 1.07
Kilo: 20
2018
"""
Yukarıda alt sınıfın init metodu içinde kullanılan 2018 değerini bir değişkene aktarabiliriz. Ancak ilave edilen değişkeni alt sınıfın init metodunun parametrelerine ilave etmeli ve nesneyi sınıfa bağlama aşamasında aşağıda gösterildiği gibi belirtmeliyiz.
class MyFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
class MyChild(MyFamily): #Ana sınıfı, MyChild isimli sınıftan sonra parantez içinde belirtiyoruz.
def __init__(self, fname, lname, age, height, weight, bdate): #init parametrelerine "bdate" parametresi ilave edildi.
super().__init__(fname, lname, age, height, weight)
self.DateofBirth = bdate #2018 yerine bdate isimli bir değişken atandı.
f1 = MyChild("Elif Mira", "Kutlu", "4", "1.07", "20", 2018) #f1 nesnesini myChild sınıfına üye yapmak için 2018 ifadesi ilave edildi.
f1.Listele() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin.
print(f1.DateofBirth) #Kullanılan özelliğin alt sınıfa ait olduğuna dikkat edin.
#Sonuç:
"""
İsim: Elif Mira
Soy İsim: Kutlu
Yaş: 4
Boy: 1.07
Kilo: 20
2018
"""
Alt sınıfa ana sınıftan bağımsız bir metot ekleyebiliriz. Ancak alt sınıf, anan sınıfın tüm metotlarını kullanmaya devam edecektir. Boynuz kulağı geçer gibi bir şey.
class MyFamily:
# init metodu
def __init__(self, fname, lname, age, height, weight):
self.fname = fname
self.lname = lname
self.age = age
self.height = height
self.weight = weight
#Liste oluşturucu metot
def Listele(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Yaş:", self.age + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
class MyChild(MyFamily): #Ana sınıfı, MyChild isimli sınıftan sonra parantez içinde belirtiyoruz.
def __init__(self, fname, lname, age, height, weight, bdate): #init parametrelerine "bdate" parametresi ilave edildi.
super().__init__(fname, lname, age, height, weight)
self.BirthDate = bdate #2018 yerine bdate isimli bir değişken atandı.
def myList(self):
print("İsim:", self.fname + "\n" + "Soy İsim:", self.lname + "\n" + "Doğum Yılı:", str(self.BirthDate) + "\n" + "Boy:", self.height + "\n" + "Kilo:", self.weight)
#Not: str(self.BirthDate) değişkenin böyle belirtilmesinin sebebi aşağıda f1 nesnesi MyChild sınıfına tanıtılırken 2018 şeklinde integer tipte bir değişken kullanılmasıdır.
#Eğer aşağıda 2018 yerine "2018" şeklinde bir ifade kullanılsaydı self.BirthDate şeklinde bir ifade yazılması yeterli olurdu.
#Sorun ise int ve str tipte değişkenlerin + operatörü ile birleştirilemeyeceği/toplanamayacağı şeklindedir.
f1 = MyChild("Elif Mira", "Kutlu", "4", "1.07", "20", 2018) #f1 nesnesini myChild sınıfına üye yapmak için 2018 ifadesi ilave edildi.
f1.Listele() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin.
#Sonuç:
#İsim: Elif Mira
#Soy İsim: Kutlu
#Yaş: 4
#Boy: 1.07
#Kilo: 20
print("___________\n")
f1.myList() #Kullanılan metodun MyFamily isimli ana sınıfa ait olduğuna dikkat edin.
#Sonuç:
#İsim: Elif Mira
#Soy İsim: Kutlu
#Doğum Yılı: 2018 #Yaş yerine doğum yılı kullanıldı.
#Boy: 1.07
#Kilo: 20
5. Python’da Yineleyiciler (iterators)
Yineleyici, sayılabilir (sonsuz olmayan) sayıda değer içeren bir nesnedir. Daha teknik bir ifadeyle Python’da yineleyici, __iter__() ve __next__() metotlarından oluşan yineleyici protokollerini uygulayan bir nesnedir.
Daha önce de değinildiği gibi Python’da “list”, “tuple”, “set” ve “dictionary” nesneleri Python’da oldukça önemlidir. Bu nesneler yinelenebilir sonlu sayıda elemanlara sahiptir. Dolayısıyla bu nesneler yineleyici elde etmemizi sağlayan bir “iter()” metoduna sahiptir.
myTuple = ("Volvo", "Volkswagen", "Peugeot")
myIterator = iter(myTuple) #Aşağıda next metodunu kullanmak için myTuple nesnesi bir yineleyiciye dönüştürüldü.
#Alttaki satırı çalıştırsanız sonuçta belirtilen hatayı alırsınız.
#print(next(myTuple)) #Sonuç: TypeError: 'tuple' object is not an iterator
print(next(myIterator)) #Volvo
print(next(myIterator)) #Volkswagen
print(next(myIterator)) #Peugeot
print("___________\n")
#String bir değer de yineleyiciye dönüştürülebilir. Çünkü karakterlerin her biri yinelenebilir birer elemandır.
myStr = "Volvo"
myIterator = iter(myStr)
print(next(myIterator)) #V
print(next(myIterator)) #o
print(next(myIterator)) #l
print(next(myIterator)) #v
print(next(myIterator)) #o
#Yinelenecek eleman kalmadığında aşağıdaki hata ile karşılaşılır.
#print(next(myIterator)) #Sonuç: StopIteration
Daha önceki makalelerde de sık sık kullanılan “for” ve “in” metotlarının kombinlenmesiyle, yinelenebilir elemanlar arasında kolaylıkla dolaşılabilir.
myTuple = ("Volvo", "Volkswagen", "Peugeot")
for x in myTuple:
print(x)
#Sonuç:
#Volvo
#Volkswagen
#Peugeot
print("___________\n")
#String bir değer de yineleyiciye dönüştürülebilir. Çünkü karakterlerin her biri yinelenebilir birer elemandır.
myStr = "Volvo"
for x in myStr:
print(x)
#SonuÇ
#V
#o
#l
#v
#o
Yineleyicilerin çalışma ilkesi yukarıdaki örneklerden de anlaşılacağı üzere döngülere oldukça benzerdir. Sınıf içinde __iter__() ve __next__() metotları kullanılarak oluşturulan geometrik seriyi aşağıda inceleyebilirsiniz.
class MyGeoSerial: # s = 1**0 + r**1 + r**2 + r**3 + ... + r**n = 1/(1-r) sonucuna sahip bir geometrik seridir. r = 3 olduğu kabul edilmiştir.
def __iter__(self): #__iter__ metodunun daha önce açıklanan __init__ metodu ile aynı göreve sahip olduğunu düşünebilirsiniz. Özetle sınıfın başlangıç parametrelerini belirtmektedir.
self.r = 3 #sayı tabanı
self.us = -1 #us, yani üs.
return self
def __next__(self):
self.us = self.us + 1
x = (self.r)**(self.us) # 3**0, 3**1, 3**2 vb.
return x
mySerial = MyGeoSerial() #mySerial ifadesi MyGeoSerial sınıfına tanıtılarak nesne yapılır.
myIterator = iter(mySerial) #mySerial nesnesi bir yineleyiciye dönüştürülür.
#Aşağıdaki her adımda geometrik serinin i. değeri yazdırılır.
print(next(myIterator)) #1
print(next(myIterator)) #3
print(next(myIterator)) #9
print(next(myIterator)) #27
print(next(myIterator)) #81
Yukarıdaki seriyi bir döngü yardımıyla kullanmak ve döngünün sonlanacağı yinelemeyi belirtmek için aşağıdaki örneği inceleyebilirsiniz.
class MyGeoSerial: # s = 1**0 + r**1 + r**2 + r**3 + ... + r**n = 1/(1-r) sonucuna sahip bir geometrik seridir. r = 3 olduğu kabul edilmiştir.
def __iter__(self): #__iter__ metodunun daha önce açıklanan __init__ metodu ile aynı göreve sahip olduğunu düşünebilirsiniz. Özetle sınıfın başlangıç parametrelerini belirtmektedir.
self.r = 3
self.us = -1
return self
def __next__(self):
if self.us <= 4: #üs 4'ten küçük veya eşitse devam et
self.us = self.us + 1
x = (self.r)**(self.us)
return x
else: #üs 4'küçük veya eşit değilse yinelemeyi durdur.
raise StopIteration
mySerial = MyGeoSerial() #mySerial ifadesi MyGeoSerial sınıfına tanıtılarak nesne yapılır.
myIterator = iter(mySerial) #mySerial nesnesi bir yineleyiciye dönüştürülür.
#Aşağıdaki her adımda geometrik serinin 1., 2., 3. vb. değeri yazdırılır.
i=0
for x in myIterator:
if i <=4:
print(x, end=", ")
else:
print(x)
i += 1
#Sonuç: 1, 3, 9, 27, 81, 243
İshak Kutlu, Veri Bilimi İçin Python Notları
