Python'da Sihirli Metotlar
Bu makale, Python'daki sihirli metotları açıklar.
YouTube Video
Python'da Sihirli Metotlar
Python'daki sihirli metotlar (özel metotlar), sınıflara benzersiz davranışlar kazandırmak için özel olarak adlandırılmış metotlardır. Örneğin, __init__
ve __str__
gibi çift alt çizgi (dunder) ile çevrelenmiş olmalarıyla karakterize edilirler. Bu nedenle, bunlara dunder metotları da denir.
Sihirli metotları tanımlayarak sınıfların standart davranışlarını özelleştirebilirsiniz. Örneğin, __add__
metodu tanımlanarak +
operatörünün davranışı değiştirilebilir.
Başlatma ve String Temsili için Sihirli Metotlar
__init__
: Başlatma Metodu
__init__
metodu, bir nesne oluşturulduğunda otomatik olarak çağrılan kurucu bir metottur.
1class Person:
2 def __init__(self, name, age):
3 self.name = name
4 self.age = age
5
6person = Person("Alice", 30)
7print(person.name) # Alice
__str__
: İnsan tarafından okunabilir string temsili
__str__
metodu, insan tarafından okunabilir bir string temsili döndürür. print()
ve str()
fonksiyonları tarafından çağrılır.
1class Person:
2 def __init__(self, name):
3 self.name = name
4
5 def __str__(self):
6 return f"Person: {self.name}"
7
8person = Person("Bob")
9print(person) # Person: Bob
__repr__
: Hata Ayıklama Odaklı String Temsili
__repr__
metodu, hata ayıklama amaçları için bir string temsili döndürür. repr()
fonksiyonu ve yorumlayıcıda gösterim sırasında kullanılır.
1class Person:
2 def __init__(self, name):
3 self.name = name
4
5 def __repr__(self):
6 return f"Person(name={self.name!r})"
7
8person = Person("Eve")
9print(repr(person)) # Person(name='Eve')
Aritmetik Operatörlerin Aşırı Yüklenmesi
__add__
: +
Operatörü
Sihirli metotlar kullanılarak aritmetik operatörler aşırı yüklenebilir. Örneğin, __add__
metodu +
operatörünün aşırı yüklenmesini sağlar.
1class Vector:
2 def __init__(self, x, y):
3 self.x = x
4 self.y = y
5
6 def __add__(self, other):
7 return Vector(self.x + other.x, self.y + other.y)
8
9 def __repr__(self):
10 return f"Vector({self.x}, {self.y})"
11
12 # Other arithmetic magic methods:
13 # def __sub__(self, other): # Subtraction (-)
14 # def __mul__(self, other): # Multiplication (*)
15 # def __truediv__(self, other): # True division (/)
16 # def __floordiv__(self, other): # Floor division (//)
17 # def __mod__(self, other): # Modulo (%)
18 # def __pow__(self, other): # Exponentiation (**)
19
20v1 = Vector(1, 2)
21v2 = Vector(3, 4)
22print(v1 + v2) # Vector(4, 6)
Diğer aritmetik sihirli metotlar şunlardır:.
Metot | Operatör |
---|---|
__add__ |
+ |
__sub__ |
- |
__mul__ |
* |
__truediv__ |
/ |
__floordiv__ |
// |
__mod__ |
% |
__pow__ |
** |
Karşılaştırma Operatörlerini Özelleştirmek
Ayrıca karşılaştırma operatörlerini de aşırı yükleyebilirsiniz. Örneğin, __eq__
metodu eşitlik operatörünü aşırı yükler.
1class Box:
2 def __init__(self, volume):
3 self.volume = volume
4
5 def __eq__(self, other):
6 return self.volume == other.volume
7
8 def __lt__(self, other):
9 return self.volume < other.volume
10
11 # Comparison magic methods:
12 # def __eq__(self, other): # Equal to (==)
13 # def __ne__(self, other): # Not equal to (!=)
14 # def __lt__(self, other): # Less than (<)
15 # def __le__(self, other): # Less than or equal to (<=)
16 # def __gt__(self, other): # Greater than (>)
17 # def __ge__(self, other): # Greater than or equal to (>=)
18
19b1 = Box(100)
20b2 = Box(200)
21
22print(b1 == b2) # False
23print(b1 < b2) # True
Ayrıca şu sihirli metotlar da vardır:. Bu sihirli metotlar, nesneler arasında eşitlik ve sıralama gibi karşılaştırmaları tanımlar.
Operatör | Sihirli Metot |
---|---|
== |
__eq__ |
!= |
__ne__ |
< |
__lt__ |
<= |
__le__ |
> |
__gt__ |
>= |
__ge__ |
Konteyner Tipleri için Sihirli Metotlar
Liste veya sözlük gibi davranan sınıflar oluşturabilirsiniz.
__len__
: Eleman Sayısını Alma
__len__
metodu, eleman sayısını döndüren bir sihirli metottur.
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __len__(self):
6 return len(self.items)
7
8basket = Basket(["apple", "banana"])
9print(len(basket)) # 2
__getitem__
: İndeks ile Erişim
__getitem__
metodu, indeks ile erişim sırasında çağrılır.
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __getitem__(self, index):
6 return self.items[index]
7
8basket = Basket(["apple", "banana"])
9print(basket[1]) # banana
__setitem__
ve __delitem__
: Yazma ve Silme
__setitem__
ve __delitem__
metotları, eleman yazılırken veya silinirken çağrılır.
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __setitem__(self, index, value):
6 self.items[index] = value
7
8 def __delitem__(self, index):
9 del self.items[index]
10
11basket = Basket(["apple", "banana"])
12basket[1] = "grape"
13del basket[0]
14print(basket.items) # ['grape']
Yineleme için Sihirli Metotlar
Bir nesnenin for
döngüsünde yinelenebilir olması için şunları uygulayın:.
__iter__
ve __next__
1class Counter:
2 def __init__(self, limit):
3 self.limit = limit
4 self.current = 0
5
6 def __iter__(self):
7 return self
8
9 def __next__(self):
10 if self.current >= self.limit:
11 raise StopIteration
12 self.current += 1
13 return self.current
14
15for num in Counter(3):
16 print(num)
17# Output:
18# 1
19# 2
20# 3
Bağlam Yöneticisi (with
İfadesi)
__enter__
ve __exit__
metotlarını tanımlayarak, with
ifadesi için öncesi ve sonrası işlemleri uygulayabilirsiniz.
1class FileOpener:
2 def __init__(self, filename):
3 self.filename = filename
4
5 def __enter__(self):
6 self.file = open(self.filename, 'r')
7 return self.file
8
9 def __exit__(self, exc_type, exc_val, exc_tb):
10 self.file.close()
11
12with FileOpener("example.txt") as f:
13 content = f.read()
14 print(content)
Çağrılabilir Nesneler: __call__
__call__
metodunu tanımlayarak bir örneği fonksiyon gibi çağrılabilir hale getirebilirsiniz.
1class Greeter:
2 def __init__(self, greeting):
3 self.greeting = greeting
4
5 def __call__(self, name):
6 return f"{self.greeting}, {name}!"
7
8hello = Greeter("Hello")
9print(hello("Alice")) # Hello, Alice!
Özet
Python'daki sihirli metotlar, sınıflara doğal ve sezgisel davranış eklemenin güçlü bir yoludur. Her metot belirli bir amaca sahiptir ve bunları doğru şekilde uygulamak daha esnek ve Pythonik kod yazmanıza olanak tanır.
Sihirli metotlar, Python nesnelerinin perde arkasında nasıl etkileştiğini ve davrandığını destekleyen 'görünmez bir arayüz' olarak hizmet eder.
Yukarıdaki makaleyi, YouTube kanalımızda Visual Studio Code'u kullanarak takip edebilirsiniz. Lütfen YouTube kanalını da kontrol edin.