Oldingi darsda bola klassning __init__ metodida ota klassning atributlarini qo'lda yozdik (self.ism = ism). Bu usul ishlaydi, lekin kamchilik bor: ota klass o'zgarsa, bola klassni ham o'zgartirish kerak. super() funksiyasi bu muammoni hal qiladi — ota klassning metodlarini bola klassdan chaqirish imkonini beradi.
class Hayvon:
def __init__(self, ism, yosh):
self.ism = ism
self.yosh = yosh
class It(Hayvon):
def __init__(self, ism, yosh, zot):
super().__init__(ism, yosh) # Hayvon.__init__ ni chaqiradi!
self.zot = zot # o'ziga xos atribut
def __str__(self):
return f"{self.ism} ({self.zot}), {self.yosh} yoshda"
bobik = It("Bobik", 3, "Labrador")
print(bobik) # Bobik (Labrador), 3 yoshda
print(bobik.ism) # Bobik — ota klassdan
print(bobik.yosh) # 3 — ota klassdan
print(bobik.zot) # Labrador — o'z atributiNatija:
Bobik (Labrador), 3 yoshda
Bobik
3
Labradorsuper().__init__(ism, yosh) — bu Hayvon.__init__(self, ism, yosh) ni chaqiradi. Ota klass ism va yosh ni o'rnatadi, keyin bola klass zot ni qo'shadi.
super() faqat __init__ da emas, istalgan metodda ishlatilishi mumkin:
class Hayvon:
def __init__(self, ism):
self.ism = ism
def malumot(self):
return f"Ism: {self.ism}"
class It(Hayvon):
def __init__(self, ism, zot):
super().__init__(ism)
self.zot = zot
def malumot(self):
asosiy = super().malumot() # ota klassning malumot() si
return f"{asosiy}, Zot: {self.zot}"
bobik = It("Bobik", "Labrador")
print(bobik.malumot()) # Ism: Bobik, Zot: LabradorBu usulda It.malumot() ota klassning malumot() ni chaqiradi va ustiga qo'shadi — kodni takrorlamaydi.
Muhim qoidalar:
super() — ota klassning metodlarini bola klassdan chaqirishsuper().__init__(...) — ota klassning __init__ ini chaqiradisuper() istalgan metodda ishlatilishi mumkinsuper() ishlatilsa bola klass avtomatik yangilanadiChegirmalik mahsulot
Mahsulot ota klassini va ChegirmalidMahsulot bola klassini yarating:
Mahsulot.__init__(self, nom, narx) — ikkala atributni saqlangChegirmalidMahsulot(Mahsulot) — Mahsulot dan meros olsinChegirmalidMahsulot.__init__(self, nom, narx, chegirma) — super().__init__() orqali ota klassni chaqiring, chegirma atributini qo'shingyakuniy_narx(self) — narx * (1 - chegirma / 100) qaytarsin__str__ — "Mahsulot: {nom}, {yakuniy_narx()} so'm" formatida qaytarsinMisol:
Kiritish:
Telefon
5000000
10Chiqish:
Mahsulot: Telefon, 4500000.0 so'm
4500000.0