Operator overloading — bu o'rnatilgan operatorlar (+, *, == va boshqalar) ni o'z klasslarimiz uchun qayta belgilash imkoniyati. Bu dunder metodlar orqali amalga oshiriladi.
Masalan, matematikada vektorlar bilan ishlaylik. Vektor — bu (x, y) koordinatalar juftligi. Ikki vektorni qo'shganda x lar va y lar alohida qo'shiladi:
class Vektor:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, boshqa):
# v1 + v2 chaqirilganda ishga tushadi
return Vektor(self.x + boshqa.x, self.y + boshqa.y)
def __str__(self):
return f"Vektor({self.x}, {self.y})"
v1 = Vektor(1, 2)
v2 = Vektor(3, 4)
v3 = v1 + v2 # __add__ chaqiriladi
print(v3) # Vektor(4, 6)v1 + v2 yozilganda Python avtomatik v1.__add__(v2) ni chaqiradi. Biz yangi Vektor obyekti qaytaramiz.
Ko'paytirish uchun __mul__ ishlatiladi:
class Vektor:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, boshqa):
return Vektor(self.x + boshqa.x, self.y + boshqa.y)
def __mul__(self, skalyar):
# v * 3 chaqirilganda ishga tushadi — skalyar ko'paytirish
return Vektor(self.x * skalyar, self.y * skalyar)
def __str__(self):
return f"Vektor({self.x}, {self.y})"
v1 = Vektor(2, 3)
v2 = v1 * 4 # __mul__ chaqiriladi
print(v2) # Vektor(8, 12)
v3 = Vektor(1, 1)
v4 = v1 + v3 # __add__ chaqiriladi
print(v4) # Vektor(3, 4)Endi kasr sonlar misolida ko'raylik. Kasr a/b ko'rinishida bo'ladi. Ikki kasrni qo'shish formulasi: a/b + c/d = (a*d + b*c) / (b*d):
class Kasr:
def __init__(self, surat, maxraj):
self.surat = surat # a — yuqori qism
self.maxraj = maxraj # b — quyi qism
def __add__(self, boshqa):
# a/b + c/d = (a*d + b*c) / (b*d)
yangi_surat = self.surat * boshqa.maxraj + self.maxraj * boshqa.surat
yangi_maxraj = self.maxraj * boshqa.maxraj
return Kasr(yangi_surat, yangi_maxraj)
def __str__(self):
return f"{self.surat}/{self.maxraj}"
k1 = Kasr(1, 2) # 1/2
k2 = Kasr(1, 3) # 1/3
k3 = k1 + k2 # 1/2 + 1/3 = (1*3 + 2*1)/(2*3) = 5/6
print(k3) # 5/61/2 + 1/3 ni hisoblaylik: (1×3 + 2×1) / (2×3) = 5/6. To'g'ri!
Muhim qoidalar:
__add__ dunder metodi + operatorini, __mul__ esa * operatorini qayta belgilaydi__add__(self, boshqa) da self — chap operand, boshqa — o'ng operandKasr klassi — qo'shish amali
Kasr klassini yarating va __add__ operator overloading ni amalga oshiring:
Kasr klassini yarating: __init__(self, surat, maxraj) — self.surat va self.maxraj saqlang__add__(self, boshqa) metodini yarating:
self.surat * boshqa.maxraj + self.maxraj * boshqa.suratself.maxraj * boshqa.maxrajKasr obyektini qaytaring__str__(self) metodini yarating: "{surat}/{maxraj}" formatida qaytarsinMisol:
Kiritish:
1 2
1 3Chiqish:
5/6