Meros olish sintaksisini bildik. Endi to'liq ota-bola klass ierarxiyasini quramiz. Ota klassda umumiy atributlar va metodlar, bola klassda o'ziga xos atributlar va metodlar bo'ladi.
Misol: geometrik shakllar. Har qanday shaklning ismi bor — bu umumiy. Ammo maydon hisoblash usuli har xil: kvadratda tomon², doirada π × r².
class Shakl:
def __init__(self, ism):
self.ism = ism # umumiy atribut
class Kvadrat(Shakl):
def __init__(self, tomon):
self.ism = "Kvadrat" # ota klassdan o'zlashtirilgan
self.tomon = tomon # o'ziga xos atribut
def maydon(self): # o'ziga xos metod
return self.tomon ** 2
class Doira(Shakl):
def __init__(self, radius):
self.ism = "Doira"
self.radius = radius
def maydon(self):
return 3.14 * self.radius ** 2
k = Kvadrat(5)
print(k.ism) # Kvadrat — ota klassdan
print(k.maydon()) # 25 — o'z metodi
d = Doira(3)
print(d.ism) # Doira
print(d.maydon()) # 28.26Natija:
Kvadrat
25
Doira
28.26Kvadrat va Doira har ikkalasi Shakl dan meros oladi. ism atributi ota klassda ta'riflangan bo'lsa ham, bola klasslar uni o'zlarida ishlatadi. maydon() esa har bir bola klassda o'z hisoblash usuli bilan yozilgan.
Bola klass o'z __init__ ini yozganda, ota klassning __init__ ni alohida chaqirish kerak bo'ladi (keyingi darsda super() bilan o'rganamiz). Hozir ism ni bevosita o'rnatayapmiz.
# Bir xil ota klass — turli bola klasslar
shakllar = [Kvadrat(4), Doira(5), Kvadrat(7)]
for shakl in shakllar:
print(f"{shakl.ism}: maydon = {shakl.maydon()}")Natija:
Kvadrat: maydon = 16
Doira: maydon = 78.5
Kvadrat: maydon = 49Muhim qoidalar:
Transport vositasi
Transport ota klassini va Velosiped bola klassini yarating:
Transport.__init__(self, ism, tezlik) — ism va tezlik atributlarini saqlangVelosiped(Transport) — Transport dan meros olsinVelosiped.__init__(self, ism, tezlik, tur) — ota klass atributlarini o'rnating, tur ni ham qo'shingVelosiped.malumot(self) — "Velosiped: {ism}, {tezlik} km/h, {tur}" formatida qaytarsinMisol:
Kiritish:
Trek
30
tog'Chiqish:
Velosiped: Trek, 30 km/h, tog'