6 - Özel (Magic) Metotlar ve Operatör Aşırı Yükleme
2025
__init__
, __str__
, __repr__
, __len__
__getitem__
, __setitem__
, __delitem__
__add__
, __sub__
, __mul__
, vb.__eq__
, __lt__
, vb.__contains__
, __call__
, __iter__
, __enter__/__exit__
__
) ile başlayıp biten metotlar.print()
, len()
, +
) etkileşimini tanımlar.__str__
:Kullanıcı dostu string temsili ( print()
, str()
)
__repr__
:Geliştirici dostu, nesneyi yeniden oluşturabilecek temsili ( repr()
)
class Ogrenci:
def __init__(self, ad, soyad, no):
self.ad = ad
self.soyad = soyad
self.no = no
def __str__(self):
return f"{self.ad} {self.soyad} ({self.no})"
def __repr__(self):
return f"Ogrenci('{self.ad}', '{self.soyad}', {self.no})"
ogr = Ogrenci("Ali", "Yılmaz", 12345)
print(ogr) # Çıktı: Ali Yılmaz (12345)
print(repr(ogr)) # Çıktı: Ogrenci('Ali', 'Yılmaz', 12345)
__len__
len()
fonksiyonu ile nesnenin uzunluğunu döndürür.__getitem__
:İndeksleme veya anahtar erişimi ( obj[key]
)
__setitem__
:İndeks/anahtar ile değer atama ( obj[key] = value
)
class SinifListesi:
def __init__(self):
self.ogrenciler = {}
def __getitem__(self, key):
return self.ogrenciler.get(key, "Öğrenci yok")
def __setitem__(self, key, value):
self.ogrenciler[key] = value
liste = SinifListesi()
liste[123] = "Ayşe Yılmaz"
print(liste[123]) # Çıktı: Ayşe Yılmaz
print(liste[999]) # Çıktı: Öğrenci yok
__delitem__
İndeks/anahtar ile eleman silme ( del obj[key]
)
class Kitap:
def __init__(self, baslik):
self.baslik = baslik
self.icerik = {}
def __setitem__(self, sayfa, metin):
self.icerik[sayfa] = metin
def __getitem__(self, sayfa):
return self.icerik.get(sayfa, "Boş sayfa")
def __delitem__(self, sayfa):
del self.icerik[sayfa]
kitap = Kitap("Python")
kitap[1] = "Giriş"
print(kitap[1]) # Çıktı: Giriş
del kitap[1]
print(kitap[1]) # Çıktı: Boş sayfa
+
, -
, *
, vb.) sınıflar için özel anlamlar kazanmasını sağlar.Operatör | Metot | İşlev |
---|---|---|
+ |
__add__ |
Toplama |
- |
__sub__ |
Çıkarma |
* |
__mul__ |
Çarpma |
/ |
__truediv__ |
Bölme |
// |
__floordiv__ |
Tam Bölme |
% |
__mod__ |
Mod Alma |
** |
__pow__ |
Üs Alma |
class Para:
def __init__(self, miktar):
self.miktar = miktar
def __add__(self, other):
if isinstance(other, Para):
return Para(self.miktar + other.miktar)
return Para(self.miktar + other)
def __mul__(self, katsayi):
return Para(self.miktar * katsayi)
def __str__(self):
return f"{self.miktar:.2f} TL"
isinstance()
type()
fonksiyonuna göre daha esnektir (kalıtımı dikkate alır).object
: Tipi kontrol edilecek nesne.classinfo
: Sınıf, tip veya bunların bir demeti (tuple).True
: Nesne, belirtilen sınıf(lar)dan veya tip(ler)den birine aitse.False
: Aksi takdirde.type()
Yerine isinstance()
?isinstance()
, alt sınıfları da doğru şekilde tanır. type()
ise yalnızca nesnenin doğrudan oluşturulduğu sınıfı kontrol eder.sayi = 10
print(isinstance(sayi, int)) # Çıktı: True
print(isinstance(sayi, float)) # Çıktı: False
print(isinstance(sayi, (int, float, str))) # Çıktı: True (çoklu kontrol)
metin = "Merhaba"
print(isinstance(metin, str)) # Çıktı: True
print(isinstance(metin, object)) # Çıktı: True (her şey object'ten türer)
liste = [1, 2, 3]
print(isinstance(liste, list)) # Çıktı: True
class Hayvan:
pass
class Kopek(Hayvan):
pass
class Kedi(Hayvan):
pass
karabas = Kopek()
print(isinstance(karabas, Kopek)) # Çıktı: True
print(isinstance(karabas, Hayvan)) # Çıktı: True (Kalıtımı dikkate alır!)
print(type(karabas) == Hayvan) # Çıktı: False (type() kalıtımı dikkate almaz)
print(isinstance(karabas, Kedi)) # Çıktı: False
mirmir = Kedi()
print(isinstance(mirmir, (Kopek, Kedi))) # Çıktı: True (çoklu kontrol)
Operatör | Metot | İşlev |
---|---|---|
== |
__eq__ |
Eşitlik |
!= |
__ne__ |
Eşit Değil |
< |
__lt__ |
Küçük |
<= |
__le__ |
Küçük veya Eşit |
> |
__gt__ |
Büyük |
>= |
__ge__ |
Büyük veya Eşit |
class Ogrenci:
def __init__(self, ad, ortalama):
self.ad = ad
self.ortalama = ortalama
def __eq__(self, other):
return self.ortalama == other.ortalama
def __lt__(self, other):
return self.ortalama < other.ortalama
ogr1 = Ogrenci("Ali", 85)
ogr2 = Ogrenci("Ayşe", 90)
print(ogr1 == ogr2) # Çıktı: False
print(ogr1 < ogr2) # Çıktı: True
__contains__
in
operatörü ile eleman varlığını kontrol eder
__call__
Nesneyi fonksiyon gibi çağırılabilir yapar
__iter__
ve __next__
Bu metotlar nesneyi döngüye uygun hale getirir.
__enter__
ve __exit__
with
bloğu ile kaynak yönetimi sağlar
class DosyaYonetici:
def __init__(self, dosya_adi, mod):
self.dosya_adi = dosya_adi
self.mod = mod
def __enter__(self):
self.dosya = open(self.dosya_adi, self.mod)
return self.dosya
def __exit__(self, exc_type, exc_val, exc_tb):
self.dosya.close()
with DosyaYonetici("test.txt", "w") as f:
f.write("Merhaba!")
class IstatistikliListe:
def __init__(self, liste=None):
self.liste = liste or []
self.erisimler = {}
def __getitem__(self, indeks):
self.erisimler[indeks] = self.erisimler.get(indeks, 0) + 1
return self.liste[indeks]
def __str__(self):
return str(self.liste)
def erisim_sayilari(self):
return self.erisimler
lst = IstatistikliListe([10, 20, 30])
print(lst[0]) # Çıktı: 10
print(lst[0]) # Çıktı: 10
print(lst.erisim_sayilari()) # Çıktı: {0: 2}
__str__
, __repr__
: Temsil__len__
, __getitem__
: Koleksiyon__add__
, __eq__
: Operatörler