Bu darsda polimorfizm va abstrakt klasslar haqida o'rganganlarimizni birlashtirib, real vazifani hal qilamiz: turli geometrik shakllarning maydoni hisoblaydigan dastur.
Har bir shakl — Kvadrat, To'g'riburchak, Doira — maydoni hisoblanish formulasi jihatdan farqlanadi. Lekin barchasida maydon() metodi bor. Bu — polimorfizm!
import math
from abc import ABC, abstractmethod
# Abstrakt ota klass — shartnoma belgilaydi
class Shakl(ABC):
@abstractmethod
def maydon(self):
pass
@abstractmethod
def __str__(self):
passHar bir farzand klass maydon() va __str__() ni o'zicha amalga oshiradi:
class Kvadrat(Shakl):
def __init__(self, tomon):
self.tomon = tomon
def maydon(self):
return self.tomon ** 2
def __str__(self):
return f"Kvadrat: tomon={self.tomon}, maydon={self.maydon()}"
class Togriburchak(Shakl):
def __init__(self, en, boy):
self.en = en
self.boy = boy
def maydon(self):
return self.en * self.boy
def __str__(self):
return f"To'g'riburchak: en={self.en}, boy={self.boy}, maydon={self.maydon()}"
class Doira(Shakl):
def __init__(self, radius):
self.radius = radius
def maydon(self):
return round(math.pi * self.radius ** 2, 2)
def __str__(self):
return f"Doira: radius={self.radius}, maydon={self.maydon()}"maydon_hisob() funksiyasi har qanday shakl bilan ishlaydi — polimorfizm:
def maydon_hisob(shakl):
print(shakl) # __str__ chaqiriladi
# Har xil shakllar — bir xil funksiya!
maydon_hisob(Kvadrat(5))
# Kvadrat: tomon=5, maydon=25
maydon_hisob(Togriburchak(4, 6))
# To'g'riburchak: en=4, boy=6, maydon=24
maydon_hisob(Doira(3))
# Doira: radius=3, maydon=28.27Bu loyihada bir nechta OOP tushunchasi birga ishlayapti:
Shakl barcha shakllar uchun shartnoma belgilaydiKvadrat, Togriburchak, Doira Shakl dan meros oladimaydon() va __str__() ni o'zicha amalga oshiradimaydon_hisob() funksiyasi qaysi shakl ekanligini bilmaydi, lekin ishlaydiMuhim qoidalar:
maydon() ni hisoblaydi__str__ dunder metodi print() chaqirilganda avtomatik ishga tushadiShakllar maydoni hisoblagichi
Abstrakt klass va uchta farzand klass yordamida shakllar maydoni hisoblaydigan dastur yarating:
from abc import ABC, abstractmethod va import math ni yozingShakl(ABC) abstrakt klassini yarating: maydon(self) va __str__(self) metodlari @abstractmethod bilan belgilansinKvadrat(Shakl) klassini yarating:
__init__(self, tomon): self.tomon = tomonmaydon(): tomon ** 2 qaytarsin__str__(): "Kvadrat: tomon={tomon}, maydon={maydon()}" qaytarsinTogriburchak(Shakl) klassini yarating:
__init__(self, en, boy): atributlarni saqlangmaydon(): en * boy qaytarsinMisol:
Kiritish:
kvadrat
5Chiqish:
Kvadrat: tomon=5, maydon=25__str__(): "To'g'riburchak: en={en}, boy={boy}, maydon={maydon()}" qaytarsinDoira(Shakl) klassini yarating:
__init__(self, radius): atributni saqlangmaydon(): round(math.pi * radius ** 2, 2) qaytarsin__str__(): "Doira: radius={radius}, maydon={maydon()}" qaytarsinmaydon_hisob(shakl) funksiyasini yarating — print(shakl) chop etsin