Nesne tabanlı programlamada son olarak sınıfların özel metodlarını nasıl kendimiz yazarız öğrenmeye çalışalım. Özel metodlar, daha önceden de bahsettiğimiz gibi bizim özel olarak çağırmadığımız ancak her classa ait metodlardır. Bunların çoğu biz tanımlamasak bile Python tarafından varsayılan olarak tanımlanır. Ancak bu metodların bazılarını da özel olarak bizim tanımlamamız gerekmektedir. Daha önceden gördüğümüz init metodu bu metodlara bir örnektir. Bu konuda bu metodlarını nasıl tanımlayacağımızı öğrenmeye çalışacağız. Şimdi örneklerimize geçelim.
class Kitap():
pass
kitap1 = Kitap() # __init__ metodu çağrılıyor.
len(kitap1) # __len__ metodu çağrılacak ancak tanımlı değil. Bunu özellikle bizim tanımlamamız gerekiyor.
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-66-5f5391921a08> in <module>() ----> 1 len(kitap1) # __len__ metodu çağrılacak ancak tanımlı değil. Bunu özellikle bizim tanımlamamız gerekiyor. TypeError: object of type 'Kitap' has no len()
print(kitap1) # __str__ metodu çağrılır.
<__main__.Kitap object at 0x000000CEE4E93390>
del kitap1 # del anahtar kelimesi bir objeyi siler ve __del__ metodu çağrılır.
kitap1
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-69-361ccf2f9d6d> in <module>() ----> 1 kitap1 NameError: name 'kitap1' is not defined
Şimdi buradaki metodları kendimiz nasıl tanımlayacağız öğrenmeye çalışalım.
init metodunu kendimiz tanımlarsak artık kendi init fonksiyonumuz çalışacaktır.
class Kitap():
def __init__(self,isim,yazar,sayfa_sayısı,tür):
print("Kitap Objesi oluşuyor....")
self.isim = isim
self.yazar = yazar
self.sayfa_sayısı = sayfa_sayısı
self.tür = tür
kitap1 = Kitap("İstanbul Hatırası","Ahmet Ümit",561,"Polisiye") # Kendi metodumuz
Kitap Objesi oluşuyor....
Normalde print(kitap1) ifadesi ekrana şöyle bir yazı yazdırıyor.
print(kitap1)
<__main__.Kitap object at 0x000000CEE886EAC8>
Ancak eğer str metodunu kendimiz tanımlarsak artık ekrana kitap1 in içeriğini daha anlaşılır yazabileceğiz.
class Kitap():
def __init__(self,isim,yazar,sayfa_sayısı,tür):
print("Kitap Objesi oluşuyor....")
self.isim = isim
self.yazar = yazar
self.sayfa_sayısı = sayfa_sayısı
self.tür = tür
def __str__(self):
# Return kullanmamız gerekli
return "İsim: {}\nYazar: {}\nSayfa Sayısı: {}\nTür: {}".format(self.isim,self.yazar,self.sayfa_sayısı,self.tür)
kitap1 = Kitap("İstanbul Hatırası","Ahmet Ümit",561,"Polisiye")
Kitap Objesi oluşuyor....
print(kitap1)
İsim: İstanbul Hatırası Yazar: Ahmet Ümit Sayfa Sayısı: 561 Tür: Polisiye
len metodu normalde özel olarak biz tanımlamazsak tanımlanan bir metod değil. Onun için bu metodu kendimiz tanımlamamız gereklidir.
len(kitap1)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-77-ab6b326ab715> in <module>() ----> 1 len(kitap1) TypeError: object of type 'Kitap' has no len()
class Kitap():
def __init__(self,isim,yazar,sayfa_sayısı,tür):
print("Kitap Objesi oluşuyor....")
self.isim = isim
self.yazar = yazar
self.sayfa_sayısı = sayfa_sayısı
self.tür = tür
def __str__(self):
# Return kullanmamız gerekli
return "İsim: {}\nYazar: {}\nSayfa Sayısı: {}\nTür: {}".format(self.isim,self.yazar,self.sayfa_sayısı,self.tür)
def __len__(self):
return self.sayfa_sayısı
kitap1 = Kitap("İstanbul Hatırası","Ahmet Ümit",561,"Polisiye")
Kitap Objesi oluşuyor....
len(kitap1) # KEndi __len__ metodumuz çağrıldı.
561
del metodu Pythonda bir objeyi del anahtar kelimesiyle sildiğimiz zaman çalıştırılan metoddur. Bu metodu kendimiz tanımlayarak ekstra özellikler ekleyebiliriz.
kitap1 = Kitap("İstanbul Hatırası","Ahmet Ümit",561,"Polisiye")
Kitap Objesi oluşuyor....
del kitap1
kitap1
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-87-361ccf2f9d6d> in <module>() ----> 1 kitap1 NameError: name 'kitap1' is not defined
class Kitap():
def __init__(self,isim,yazar,sayfa_sayısı,tür):
print("Kitap Objesi oluşuyor....")
self.isim = isim
self.yazar = yazar
self.sayfa_sayısı = sayfa_sayısı
self.tür = tür
def __str__(self):
# Return kullanmamız gerekli
return "İsim: {}\nYazar: {}\nSayfa Sayısı: {}\nTür: {}".format(self.isim,self.yazar,self.sayfa_sayısı,self.tür)
def __len__(self):
return self.sayfa_sayısı
def __del__(self):
print("Kitap objesi siliniyor.......")
kitap1 = Kitap("İstanbul Hatırası","Ahmet Ümit",561,"Polisiye")
Kitap Objesi oluşuyor....
del kitap1 # Ekstra ekrana yazdırma özelliği ekledik.
Kitap objesi siliniyor.......
kitap1
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-96-361ccf2f9d6d> in <module>() ----> 1 kitap1 NameError: name 'kitap1' is not defined
Siz de bunlar gibi çoğu özel metodu ihtiyacınız olduğu zaman kendiniz yazabilirsiniz. Özel metodlar için güzel bir ingilizce kaynak için şuradan faydalanabilirsiniz.