Ana içeriğe geç
Modül 7 · Ders 3 ders 4Kurstaki 27/36~12 min
Modül dersleri (3/4)

Özel yöntemler (dunder)

Özel yöntemler (dunder yöntemleri olarak adlandırılır çünkü başlayıp biterler) çift alt çizgiyle: __name__) nesnelerinizin dille bütünleşme: metin gösterimi, == ile karşılaştırma, len(), in, operatörler vb. için destek.

Zaten bir tane kullandınız: __init__.

__str__ ve __repr__

print() ve REPL'de nelerin görüneceğini kontrol ederler.

Python
class Punto:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Punto({self.x}, {self.y})"

    def __str__(self):
        return f"({self.x}, {self.y})"

p = Punto(3, 4)
str(p)        # '(3, 4)'        — per umani
repr(p)       # 'Punto(3, 4)'   — per debugger / dev
print(p)      # '(3, 4)'
p             # Punto(3, 4)     in REPL → repr
[p, p]        # [Punto(3, 4), Punto(3, 4)]   — sempre repr nei contenitori

Yalnızca __repr__ tanımlarsanız Python bunu bir geri dönüş olarak da kullanır. __str__.

__eq__: == yeniden tanımlanıyor

Varsayılan olarak a == b nesnelerin tanımlayıcılarını karşılaştırır (is), değil içerikleri. Yapısal karşılaştırma için __eq__ tanımını yapın:

Python
class Punto:
    def __init__(self, x, y):
        self.x, self.y = x, y

    def __eq__(self, other):
        if not isinstance(other, Punto):
            return NotImplemented
        return (self.x, self.y) == (other.x, other.y)

Punto(1, 2) == Punto(1, 2)    # True
Punto(1, 2) == Punto(3, 4)    # False

Türler kullanıldığında NotImplemented (özel bir anahtar kelime, False değil!) döndürülüyor karşılaştırılabilir olmaması doğru uygulamadır: Python daha sonra şunu deneyecektir: diğer işlenenin __eq__.

__len__: len() desteği

Python
class Cesto:
    def __init__(self):
        self.frutti = []

    def __len__(self):
        return len(self.frutti)

c = Cesto()
c.frutti.append("mela")
len(c)        # 1
bool(c)       # True (len > 0)

__len__ tanımlayarak ayrıca boolean değerini de ücretsiz olarak elde edersiniz: bir nesne len() == 0 ile sahte olur.

Diğer faydalı bilgiler (genel bakış)

  • __add__(self, other) → +'yi yeniden tanımlar
  • __lt__, __le__, __gt__, __ge__ → karşılaştırma operatörleri
  • __contains__(self, item) → item in self'yi destekler
  • __iter__ + __next__ → nesneyi yinelenebilir hale getirir
  • __getitem__(self, key) → self[key]'yi destekler
  • __hash__ → bir dict anahtarı / set öğesi olması gerekir

Sıra sende

Egzersiz#python.m7.l3.e1
Denemeler: 0Yükleniyor…

'Para'yı __init__(self, miktar, para birimi) ve 'f'{amount} {currency}'' değerini döndüren __str__ ile tanımlayın. `s = Money(42, 'EUR')` oluşturun ve `str(s)`yi değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

__str__'deki f-string.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#python.m7.l3.e2
Denemeler: 0Yükleniyor…

(a, b)'nin yapısal karşılaştırmasına dayanarak __init__(self, a, b) ve __eq__ ile 'Çift'i tanımlayın. 'Çift(1, 2) == Çift(1, 2)'yi değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

(self.a, self.b) == (other.a, other.b) demetlerini karşılaştırın.

3 denemeden sonra çözüm mevcut

Ek zorluk

Egzersiz#python.m7.l3.e3
Denemeler: 0Yükleniyor…

\`Başlık\` ve \`yazar\` alan bir kurucuyla \`Kitap\` sınıfını tanımlayın. \`__str__(self)\` özel yöntemini tanımlayın, böylece \`"Yazarın Başlığı"\` dizesini döndürsün (örneğin, \`'1984, George Orwell'\`). Bir kitap örneği oluşturun ve \`str(book)\` değerini değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

def __str__(self): içinde f"{self.title} by {self.author}" kullanın.

3 denemeden sonra çözüm mevcut