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ı: Trueclass 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