Python'da Sihirli Metotlar

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.

YouTube Video