Oldingi darsda __add__ va __mul__ ni o'rgandik. Endi yana uchta muhim dunder metodini ko'rib chiqamiz: __len__, __eq__ va __repr__.
__len__ — len() funksiyasi chaqirilganda ishga tushadi. __eq__ — == operatori chaqirilganda. __repr__ — obyektning rasmiy tasvirini qaytaradi (debug uchun juda foydali).
Savatchani misol sifatida ko'raylik:
class Savatcha:
def __init__(self):
self.mahsulotlar = [] # bo'sh ro'yxat bilan boshlaymiz
def qosh(self, mahsulot):
self.mahsulotlar.append(mahsulot)
def __len__(self):
# len(savatcha) chaqirilganda
return len(self.mahsulotlar)
def __repr__(self):
# print(savatcha) yoki debug paytida ko'rsatiladi
return f"Savatcha({self.mahsulotlar})"
s = Savatcha()
s.qosh("Olma")
s.qosh("Non")
s.qosh("Sut")
print(len(s)) # 3 — __len__ chaqirildi
print(s) # Savatcha(['Olma', 'Non', 'Sut']) — __repr__ chaqirildiEndi __eq__ ni qo'shamiz:
class Savatcha:
def __init__(self):
self.mahsulotlar = []
def qosh(self, mahsulot):
self.mahsulotlar.append(mahsulot)
def __len__(self):
return len(self.mahsulotlar)
def __eq__(self, boshqa):
# s1 == s2 chaqirilganda
return self.mahsulotlar == boshqa.mahsulotlar
def __repr__(self):
return f"Savatcha({self.mahsulotlar})"
s1 = Savatcha()
s1.qosh("Olma")
s1.qosh("Non")
s2 = Savatcha()
s2.qosh("Olma")
s2.qosh("Non")
s3 = Savatcha()
s3.qosh("Sut")
print(s1 == s2) # True — bir xil mahsulotlar
print(s1 == s3) # False — mahsulotlar farqli__str__ va __repr__ farqi: __str__ foydalanuvchiga ko'rsatish uchun, __repr__ esa developer (dasturchi) uchun — to'liq texnik ma'lumot beradi. Agar faqat __repr__ aniqlangan bo'lsa, u print() da ham ishlatiladi.
class Ball:
def __init__(self, qiymat):
self.qiymat = qiymat
def __str__(self):
return f"Baho: {self.qiymat}" # foydalanuvchi ko'radi
def __repr__(self):
return f"Ball(qiymat={self.qiymat})" # developer ko'radi
b = Ball(95)
print(b) # Baho: 95 — __str__ ishladi
print(repr(b)) # Ball(qiymat=95) — __repr__ ishladiMuhim qoidalar:
__len__ — len(obj) chaqirilganda, butun son qaytarishi shart__eq__ — obj1 == obj2 chaqirilganda, True yoki False qaytaradi__repr__ — obyektning to'liq texnik tasviri; __str__ aniqlanmasa u ham ishlatiladiSozlamalar klassi — len, eq, str
Sozlamalar klassini yarating va bir nechta dunder metodlarni amalga oshiring:
Sozlamalar klassini yarating: __init__(self) — ichki self.data = {} lug'at bilan boshlasinqosh(self, kalit, qiymat) metodini yarating — self.data[kalit] = qiymat saqlasin__len__(self) metodini yarating — len(self.data) qaytarsin__eq__(self, boshqa) metodini yarating — self.data == boshqa.data qaytarsin__str__(self) metodini yarating — "Sozlamalar: {n} ta" qaytarsin (n — sozlamalar soni)Misol:
Kiritish:
3
til python
darslik xorazmiy
saviya ortaChiqish:
3
Sozlamalar: 3 ta