Magic Metodlar, Python’da özel (veya magic) metodlar, çift alt çizgi (__
) ile başlayan ve biten metodlardır. Bu metodlar, Python’daki sınıfların belirli davranışlarını özelleştirmek için kullanılır. Örneğin, bir nesnenin nasıl karşılaştırılacağını, nasıl temsil edileceğini veya nasıl aritmetik işlemlerle etkileşime gireceğini kontrol etmek için bu metodlar kullanılır. Özel metodlar, Python’un sınıflarını daha esnek ve güçlü hale getirir.
1. __init__
Metodu
__init__
metodu, bir sınıftan yeni bir nesne oluşturulduğunda otomatik olarak çağrılan yapıcı (constructor) metodudur. Nesneye ilk değerlerin atanmasını sağlar.
Örnek:
class Araba:
def __init__(self, marka, model, yil):
self.marka = marka
self.model = model
self.yil = yil
araba1 = Araba("Toyota", "Corolla", 2020)
print(araba1.marka) # Toyota
2. __str__
ve __repr__
Metodları
__str__
: Nesneninstr()
veyaprint()
ile çağrıldığında nasıl görüneceğini kontrol eder.__repr__
: Nesneninrepr()
ile çağrıldığında veya etkileşimli kabukta gösterildiğinde nasıl görüneceğini kontrol eder.
Örnek:
class Araba:
def __init__(self, marka, model, yil):
self.marka = marka
self.model = model
self.yil = yil
def __str__(self):
return f"{self.marka} {self.model} ({self.yil})"
def __repr__(self):
return f"Araba('{self.marka}', '{self.model}', {self.yil})"
araba1 = Araba("Toyota", "Corolla", 2020)
print(araba1) # Toyota Corolla (2020)
print(repr(araba1)) # Araba('Toyota', 'Corolla', 2020)
3. __len__
ve __getitem__
Metodları
__len__
:len()
fonksiyonu çağrıldığında çalıştırılır ve nesnenin uzunluğunu döndürür.__getitem__
: Bir nesnenin bir öğesine indeksleme ile erişildiğinde çağrılır.
Örnek:
class Liste:
def __init__(self, elemanlar):
self.elemanlar = elemanlar
def __len__(self):
return len(self.elemanlar)
def __getitem__(self, index):
return self.elemanlar[index]
my_list = Liste([1, 2, 3, 4, 5])
print(len(my_list)) # 5
print(my_list[2]) # 3
4. Aritmetik Özel Metodlar
Python’da aritmetik işlemleri özelleştirmek için özel metodlar kullanılır:
__add__
:+
operatörü için__sub__
:-
operatörü için__mul__
:*
operatörü için__truediv__
:/
operatörü için__floordiv__
://
operatörü için__mod__
:%
operatörü için__pow__
:**
operatörü için
Örnek:
class Vektor:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vektor(self.x + other.x, self.y + other.y)
def __str__(self):
return f"Vektor({self.x}, {self.y})"
v1 = Vektor(2, 3)
v2 = Vektor(4, 5)
v3 = v1 + v2 # __add__ metodu çağrılır
print(v3) # Vektor(6, 8)
5. Karşılaştırma Özel Metodları
Python’da nesneleri karşılaştırmak için özel metodlar kullanılır:
__eq__
:==
operatörü için__ne__
:!=
operatörü için__lt__
:<
operatörü için__le__
:<=
operatörü için__gt__
:>
operatörü için__ge__
:>=
operatörü için
Örnek:
class Kisi:
def __init__(self, isim, yas):
self.isim = isim
self.yas = yas
def __eq__(self, other):
return self.yas == other.yas
def __lt__(self, other):
return self.yas < other.yas
kisi1 = Kisi("Ali", 25)
kisi2 = Kisi("Veli", 30)
print(kisi1 == kisi2) # False
print(kisi1 < kisi2) # True
6. __call__
Metodu
__call__
metodu, bir nesnenin fonksiyon gibi çağrılmasına olanak tanır.
Örnek:
class Toplayici:
def __init__(self, baslangic=0):
self.toplam = baslangic
def __call__(self, sayi):
self.toplam += sayi
return self.toplam
topla = Toplayici()
print(topla(10)) # 10
print(topla(20)) # 30
Bu örnekte, Toplayici
sınıfından oluşturulan topla
nesnesi bir fonksiyon gibi çağrılabilir.
7. __enter__
ve __exit__
Metodları
Bu metodlar, bir nesnenin with
ifadesi içinde nasıl davranacağını kontrol eder. Bu, kaynak yönetimi için kullanışlıdır (örneğin, dosya işlemleri).
Örnek:
class DosyaYoneticisi:
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 DosyaYoneticisi("deneme.txt", "w") as dosya:
dosya.write("Merhaba, dünya!")
Bu örnekte, __enter__
metodu dosyayı açar ve __exit__
metodu dosyayı kapatır.
Python’da özel (magic) metodlar, sınıfların davranışlarını özelleştirmek için kullanılır. Bu metodlar, sınıfların Python’daki yerleşik işlemlerle nasıl etkileşime girdiğini kontrol eder ve geliştiricilere sınıfları daha esnek ve güçlü hale getirme olanağı sağlar. Bu metodları kullanarak, sınıflarınızı daha etkili bir şekilde özelleştirebilir ve Python‘un sunduğu çeşitli olanaklardan tam anlamıyla yararlanabilirsiniz.
Bir yanıt yazın