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.
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 contenitoriYalnı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:
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) # FalseTü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
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
'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.
İpucu göster
__str__'deki f-string.
3 denemeden sonra çözüm mevcut
Alıştırmayı gözden geçirin
(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.
İ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
\`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.
İpucu göster
def __str__(self): içinde f"{self.title} by {self.author}" kullanın.
3 denemeden sonra çözüm mevcut