Sınıflarda Dunder Methotlar, sınıfların methotllarında başında ve sonunda çift çizgi("__XXX__") bulunan methotlara Dunder (Double Underscore(Çift Altçizgi)) methotlar veye Magic (sihirli) methodlar da denir. Sınıf yapılara içersinde gördüğümüz "__init__" yapısıda bir dunder methodtur. Sınıf içerisinde tanımlı olan dunder methotları listelemek için basit bir sınıf oluşturarak inceleyelim.
class Insan():
def __init__(self,isim,dogumTarihi,emailAdresi):
self.isim=isim
self.dogumTarihi=dogumTarihi
self.emailAdresi=emailAdresi
insan1=Insan("Enes","1989","e@gmail.com")
#.__dir__() ifadesi sınıf örneklendirmesi içersinde bulunan değişkenleri, methodları ve dunder methotlarını listelemek için kullanılır.
print(insan1.__dir__())
Çıktı:
['isim', 'dogumTarihi', 'emailAdresi', '__module__', '__init__', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
Dunder Methodlarından bazılarını inceleyelim;
1. __init__() : Oluşturulan sınıfın bir örneğini oluşturmak için kullanılır. Önceki derslerimizde de değindiğimiz bir methodtur.
def __init__(self,isim,dogumTarihi,emailAdresi):
self.isim=isim
self.dogumTarihi=dogumTarihi
self.emailAdresi=emailAdresi
2.__str__(), __repr__(): Genellikle sınıftan oluşturulan örneğin temsil değerini ekrana yazdırmak için kullanılır. __str__() son kullanıcıya çıktı oluşturmak için kullanılırken __repr__() esas olarak hata ayıklama ve geliştirme için kullanılır. __repr__()'nin amacı net olmak ve __str__() 'nin ise okunabilir olmaktır
class Insan():
def __init__(self,isim,dogumTarihi,emailAdresi):
self.isim=isim
self.dogumTarihi=dogumTarihi
self.emailAdresi=emailAdresi
insan1=Insan("Enes","1989","e@gmail.com")
print(insan1)
print(insan1.__str__())
print(insan1.__repr__())
Çıktı:
<__main__.Insan object at 0x000002341DE8B340> <__main__.Insan object at 0x000002341DE8B340> <__main__.Insan object at 0x000002341DE8B340>
Dikkat edilirse print(insan1), print(insan1.__str__()) ve print(insan1.__repr__()) değerleri çıktıları aynıdır. bu değerler yerine istediğimiz sonucun dönmesini sağlayabiliriz. Bunun için ilgili yöntemi geçersiz kılarak kendimiz method çıktısını değiştirebiliriz.
class Insan():
def __init__(self,isim,dogumTarihi,emailAdresi):
self.isim=isim
self.dogumTarihi=dogumTarihi
self.emailAdresi=emailAdresi
def __str__(self):
return "İsim:{} Doğum Tarihi:{} Email Adresi:{}".format(self.isim,self.dogumTarihi,self.emailAdresi)
def __repr__(self):
return "İsim:{} Doğum Tarihi:{} Email Adresi:{}".format(self.isim,self.dogumTarihi,self.emailAdresi)
insan1=Insan("Enes","1989","e@gmail.com")
print(insan1)
print(insan1.__str__())
print(insan1.__repr__())
Çıktı:
İsim:Enes Doğum Tarihi:1989 Email Adresi:e@gmail.com İsim:Enes Doğum Tarihi:1989 Email Adresi:e@gmail.com İsim:Enes Doğum Tarihi:1989 Email Adresi:e@gmail.com
3.__dir__(): Sınıf örneklendirmesi içersinde bulunan değişkenleri, methodları ve dunder methotlarını listelemek için kullanılır.
class Insan():
def __init__(self,isim,dogumTarihi,emailAdresi):
self.isim=isim
self.dogumTarihi=dogumTarihi
self.emailAdresi=emailAdresi
insan1=Insan("Enes","1989","e@gmail.com")
print(insan1.__dir__())
Çıktı:
['isim', 'dogumTarihi', 'emailAdresi', '__module__', '__init__', '__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__', '__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__', '__format__', '__sizeof__', '__dir__', '__class__']
4.__len__(): Sınıf değişkenlerinin uzunluklarının bulunmasını sağlamaktadır.
class Insan():
def __init__(self,isim,dogumTarihi,emailAdresi):
self.isim=isim
self.dogumTarihi=dogumTarihi
self.emailAdresi=emailAdresi
def __len__(self):
return len(self.item)
insan1=Insan("Enes","1989","e@gmail.com")
print(insan1.dogumTarihi.__len__())
Çıktı:
4