Ba'zan shunday holatlar bo'ladiki, ota klass farzand klasslariga: "Siz bu metodlarni albatta yozishingiz kerak!" deb aytishi zarur. Buning uchun abstrakt klass (abstract class) ishlatiladi.
Abstrakt klass — to'liq amalga oshirilmagan, bevosita obyekt yaratib bo'lmaydigan klass. U faqat "shartnoma" — farzand klasslar qanday metodlarga ega bo'lishi kerakligini belgilaydi.
Python da abstrakt klasslar uchun abc (Abstract Base Classes) moduli ishlatiladi:
from abc import ABC, abstractmethod
class Shakl(ABC): # ABC dan meros oladi
@abstractmethod # bu metod albatta qayta yozilishi shart
def maydon(self):
pass # farzand shu metodning tanasini yozadiKeling, to'liq misolni ko'ramiz:
from abc import ABC, abstractmethod
class Shakl(ABC):
@abstractmethod
def maydon(self):
pass # farzand klass shu metodning tanasini yozadi
class Kvadrat(Shakl):
def __init__(self, tomon):
self.tomon = tomon
def maydon(self):
return self.tomon ** 2 # maydon = tomon²
class Doira(Shakl):
def __init__(self, radius):
self.radius = radius
def maydon(self):
import math
return round(math.pi * self.radius ** 2, 2)
# Natijalar
k = Kvadrat(4)
print(k.maydon()) # 16
d = Doira(3)
print(d.maydon()) # 28.27Agar Shakl dan bevosita obyekt yaratmoqchi bo'lsak, Python xato beradi:
# Bu XATO! Abstrakt klassdan obyekt yaratib bo'lmaydi
s = Shakl()
# TypeError: Can't instantiate abstract class Shakl
# with abstract method maydonAgar farzand klass maydon() metodini yozmasa ham xato bo'ladi:
class Uchburchak(Shakl):
def __init__(self, asos, balandlik):
self.asos = asos
self.balandlik = balandlik
# maydon() yozilmagan!
u = Uchburchak(3, 4)
# TypeError: Can't instantiate abstract class Uchburchak
# with abstract method maydonAbstrakt klass — bu "shartnoma": kim bu klassdan meros olsa, belgilangan metodlarni yozishga majbur. Bu katta loyihalarda juda foydali — dasturchilar aniq bir "qoidalar to'plamiga" amal qiladi.
Muhim qoidalar:
ABC dan meros oladi, abstrakt metodlar @abstractmethod bilan belgilanadi@abstractmethod metodlarini qayta yozishi shartHayvonlar ovozi — abstrakt klass bilan
Abstrakt klass va uchta farzand klass yarating:
abc modulidan ABC va abstractmethod ni import qilingHayvon(ABC) abstrakt klassini yarating: tovush(self) metodi @abstractmethod bilan belgilansinIt(Hayvon) klassini yarating: tovush() metodi "Vov!" qaytarsinMushuk(Hayvon) klassini yarating: tovush() metodi "Miyov!" qaytarsinSigir(Hayvon) klassini yarating: tovush() metodi "Moo!" qaytarsintovush_chiqar(hayvon) funksiyasini yarating — hayvon.tovush() natijasini chop etsinMisol:
Kiritish:
itChiqish:
Vov!