Bola klass ota klassning barcha metodlarini meros oladi. Ammo ba'zan bola klass ota klassning metodini boshqacha qilmoqchi bo'ladi. Buning uchun metodlarni qayta yozish (method overriding) ishlatiladi — bola klassda ota klassning metodi bilan bir xil nom bilan yangi metod yoziladi.
class Hayvon:
def __init__(self, ism):
self.ism = ism
def tovush(self):
return "..." # umumiy, noaniq tovush
class It(Hayvon):
def tovush(self): # ota klassning metodini qayta yozdi
return "Vov-vov!"
class Mushuk(Hayvon):
def tovush(self): # ota klassning metodini qayta yozdi
return "Miyov!"
class Baliq(Hayvon):
pass # tovush() ni qayta yozmadi — otanikini ishlatadi
bobik = It("Bobik")
mitti = Mushuk("Mitti")
nemo = Baliq("Nemo")
print(bobik.tovush()) # Vov-vov! — o'z metodi
print(mitti.tovush()) # Miyov! — o'z metodi
print(nemo.tovush()) # ... — ota klassdan meros olindiNatija:
Vov-vov!
Miyov!
...Python metodni qidirganda avval bola klassdan qidiradi. Topilsa — shu metod chaqiriladi. Topilmasa — ota klassdan izlaydi. Shu tarzda It va Mushuk o'zlarining tovush() metodini, Baliq esa ota klassning metodini ishlatadi.
Bu mexanizm polimorfizm ning asosidir — bir xil metod nomi, turli xatti-harakat:
hayvonlar = [It("Bobik"), Mushuk("Mitti"), It("Rex"), Baliq("Nemo")]
for hayvon in hayvonlar:
print(f"{hayvon.ism}: {hayvon.tovush()}")Natija:
Bobik: Vov-vov!
Mitti: Miyov!
Rex: Vov-vov!
Nemo: ...Bir xil tovush() chaqiruviga har bir obyekt o'z javobini beradi — bu polimorfizmning oddiy namunasi.
Muhim qoidalar:
Xodim va Menejer
Xodim ota klassini va Menejer bola klassini yarating:
Xodim.__init__(self, ism, ish_haqi) — ikkala atributni saqlangXodim.malumot(self) — "Xodim: {ism}, {ish_haqi} so'm" qaytarsinMenejer(Xodim) — Xodim dan meros olsinMenejer.malumot(self) — "Menejer: {ism}, {ish_haqi} so'm (+bonus)" qaytarsin (ota klassni qayta yozsin)Misol:
Kiritish:
xodim
Ali
5000000Chiqish:
Xodim: Ali, 5000000 so'm