Pythonda Abstrakt Sinflar

Pythonda abstrakt sinflar yaratish va ularni qanday ishlatishni o'rganing.

So'nggi yangilanish: 2024-12-26

Barchaga hayrli kun! Bugun biz Obyektga Yo'naltirilgan Dasturlash (OOP)ning muhim tushunchalaridan biri - Abstract Classes (Abstrakt Sinflar) haqida chuqur o'rganamiz. Abstrakt sinflar bizga yuqori darajadagi abstraksiya va interfeys yaratish imkonini beradi, bu esa katta va murakkab dasturlar yaratishda juda foydali.

Abstract Class nima?

Abstract class - bu to'g'ridan-to'g'ri namuna (instance) yaratib bo'lmaydigan sinf. U odatda boshqa sinflar uchun asosiy shablon vazifasini bajaradi. Abstract class o'z ichiga bir yoki bir nechta abstrakt metodlarni olishi mumkin - bu shunday metodlarki, ularning faqat e'loni (declaration) mavjud, ammo amalga oshirilishi (implementation) yo'q.

Python-da abstract class-larni yaratish uchun abc (Abstract Base Classes) modulidan foydalaniladi.

Abstract Class-larning Afzalliklari

  1. Interfeys yaratish: Abstract class-lar yordamida biz aniq interfeys yaratishimiz mumkin, ya'ni hosila sinflar qanday metodlarga ega bo'lishi kerakligini belgilaymiz.
  2. Kod takrorlanishini kamaytirish: Umumiy xususiyatlar va metodlarni abstract class-da saqlash orqali, biz kod takrorlanishini kamaytiramiz.
  3. Dizayn shablonlarini qo'llash: Abstract class-lar ko'p dizayn shablonlarining asosiy qismi hisoblanadi.
  4. Tizim arxitekturasini yaxshilash: Ular tizim arxitekturasini aniqroq va tushunarli qilishga yordam beradi.

Abstract Class Yaratish

Keling, abstract class yaratishning asosiy sintaksisini ko'rib chiqaylik:

from abc import ABC, abstractmethod

class AbstractClassNomi(ABC):
    @abstractmethod
    def abstrakt_metod(self):
        pass

Bu yerda:

  • ABC - bu Abstract Base Class, abc modulidan import qilinadi.
  • @abstractmethod - bu dekorator, metodni abstrakt metod sifatida belgilaydi.

Amaliy Misol: Shakl Abstract Class

Keling, geometrik shakllar uchun abstract class yarataylik:

from abc import ABC, abstractmethod
import math

class Shakl(ABC):
    @abstractmethod
    def maydon(self):
        pass

    @abstractmethod
    def perimetr(self):
        pass

class Doira(Shakl):
    def __init__(self, radius):
        self.radius = radius

    def maydon(self):
        return math.pi * self.radius ** 2

    def perimetr(self):
        return 2 * math.pi * self.radius

class Kvadrat(Shakl):
    def __init__(self, tomon):
        self.tomon = tomon

    def maydon(self):
        return self.tomon ** 2

    def perimetr(self):
        return 4 * self.tomon

# Foydalanish
doira = Doira(5)
print(f"Doira maydoni: {doira.maydon():.2f}")
print(f"Doira perimetri: {doira.perimetr():.2f}")

kvadrat = Kvadrat(4)
print(f"Kvadrat maydoni: {kvadrat.maydon()}")
print(f"Kvadrat perimetri: {kvadrat.perimetr()}")

Bu misolda:

  • Shakl - bu abstract class, unda ikkita abstrakt metod mavjud: maydon() va perimetr().
  • Doira va Kvadrat - bu Shakl abstract class-idan meros olgan konkret sinflar.
  • Har bir konkret sinf maydon() va perimetr() metodlarini o'ziga xos tarzda amalga oshiradi.

Abstract Property

Python-da biz nafaqat metodlarni, balki xususiyatlarni (property) ham abstrakt qilishimiz mumkin:

from abc import ABC, abstractmethod

class AbstractClassNomi(ABC):
    @property
    @abstractmethod
    def abstrakt_xususiyat(self):
        pass

Misol uchun, bizning Shakl abstract class-imizga abstrakt xususiyat qo'shaylik:

from abc import ABC, abstractmethod
import math

class Shakl(ABC):
    @property
    @abstractmethod
    def nom(self):
        pass

    @abstractmethod
    def maydon(self):
        pass

    @abstractmethod
    def perimetr(self):
        pass

class Doira(Shakl):
    def __init__(self, radius):
        self.radius = radius

    @property
    def nom(self):
        return "Doira"

    def maydon(self):
        return math.pi * self.radius ** 2

    def perimetr(self):
        return 2 * math.pi * self.radius

# Foydalanish
doira = Doira(5)
print(f"{doira.nom} maydoni: {doira.maydon():.2f}")

Abstract Class-larning Qo'shimcha Xususiyatlari

1. Qisman Amalga Oshirish

Abstract class-lar ba'zi metodlarni to'liq amalga oshirishi mumkin:

from abc import ABC, abstractmethod

class AbstractDatabase(ABC):
    @abstractmethod
    def connect(self):
        pass

    @abstractmethod
    def disconnect(self):
        pass

    def execute_query(self, query):
        self.connect()
        print(f"Executing query: {query}")
        self.disconnect()

class MySQLDatabase(AbstractDatabase):
    def connect(self):
        print("Connecting to MySQL database")

    def disconnect(self):
        print("Disconnecting from MySQL database")

# Foydalanish
db = MySQLDatabase()
db.execute_query("SELECT * FROM users")

Bu misolda execute_query metodi abstract class-da to'liq amalga oshirilgan.

2. Abstract Class-larni Birlashitirish

Python ko'p merosni qo'llab-quvvatlaydi, shuning uchun biz bir nechta abstract class-larni birlashtirishimiz mumkin:

from abc import ABC, abstractmethod

class Drawable(ABC):
    @abstractmethod
    def draw(self):
        pass

class Resizable(ABC):
    @abstractmethod
    def resize(self):
        pass

class Rectangle(Drawable, Resizable):
    def draw(self):
        print("Drawing a rectangle")

    def resize(self):
        print("Resizing the rectangle")

# Foydalanish
rect = Rectangle()
rect.draw()
rect.resize()

Abstract Class vs Interface

Python-da "interface" tushunchasi yo'q, lekin abstract class-lar ko'pincha interface vazifasini bajaradi. Boshqa tillardagi interface-lardan farqli o'laroq, Python abstract class-lari qisman amalga oshirilgan metodlarga ega bo'lishi mumkin.

Tez-tez So'raladigan Savollar (TSS)

  1. S: Abstract class-dan to'g'ridan-to'g'ri namuna (instance) yaratish mumkinmi? J: Yo'q, abstract class-dan to'g'ridan-to'g'ri namuna yaratib bo'lmaydi. Agar siz buni qilishga harakat qilsangiz, TypeError xatosini olasiz.
  2. S: Abstrakt metodlarni qanday aniqlash kerak? J: Abstrakt metodlar @abstractmethod dekoratori bilan belgilanadi va odatda pass operatori bilan tanasiz qoldiriladi.
  3. S: Agar hosila sinf barcha abstrakt metodlarni amalga oshirmasa nima bo'ladi? J: Agar hosila sinf barcha abstrakt metodlarni amalga oshirmasa, u ham abstrakt hisoblanadi va undan namuna yaratib bo'lmaydi.
  4. S: Abstract class oddiy sinfdan nimasi bilan farq qiladi? J: Abstract class-dan namuna yaratib bo'lmaydi va u kamida bitta abstrakt metodga ega bo'lishi kerak. Oddiy sinflar esa to'g'ridan-to'g'ri namuna yaratish uchun ishlatilishi mumkin.
  5. S: Abstract class-da konstruktor bo'lishi mumkinmi? J: Ha, abstract class-da konstruktor bo'lishi mumkin. Bu konstruktor odatda umumiy initsializatsiya vazifalarini bajaradi.
  6. S: Abstrakt xususiyatlar (property) qanday ishlaydi? J: Abstrakt xususiyatlar @property va @abstractmethod dekoratorlari bilan belgilanadi. Hosila sinflar bu xususiyatlarni amalga oshirishi shart.
  7. S: Abstract class-lar merosxo'rlikni qanday ta'minlaydi? J: Abstract class-lar merosxo'rlikni oddiy sinflar kabi ta'minlaydi. Farqi shundaki, hosila sinflar abstrakt metodlarni amalga oshirishi shart.
  8. S: Nima uchun abstract class-lar ishlatiladi? J: Abstract class-lar interfeys yaratish, kod takrorlanishini kamaytirish va tizim arxitekturasini yaxshilash uchun ishlatiladi.
  9. S: Abstract class-lar va Mixin-lar o'rtasida qanday farq bor? J: Abstract class-lar asosiy shablon vazifasini bajaradi va abstrakt metodlarga ega. Mixin-lar esa tayyor funksionallikni ta'minlaydi va odatda abstrakt metodlarga ega emas.
  10. S: Python-da abstract class-larni qo'llashning eng yaxshi amaliyotlari qanday? J: Abstract class-larni faqat kerak bo'lganda ishlating, ularni sodda va aniq saqlang, va imkon qadar ko'p umumiy funksionallikni abstract class-da joylashtiring.

Xulosa

Abstract class-lar - bu Python-da OOP tamoyillarini qo'llashning kuchli vositasi. Ular bizga yuqori darajadagi abstraksiya va aniq interfeys yaratish imkonini beradi, bu esa katta va murakkab dasturlar yaratishda juda foydali. Abstract class-lardan to'g'ri foydalanish orqali siz yanada toza, tushunarli va kengaytiriladigan kod yozishingiz mumkin.

Abstract class-lar tushunchasini o'zlashtirish va amalda qo'llash orqali siz nafaqat Python-da, balki boshqa OOP tillarida ham yuqori sifatli va professional darajadagi dasturlar yaratish imkoniyatiga ega bo'lasiz.

Qo'shimcha Manbalar

  1. Python Rasmiy Hujjatlari - abc moduli
  2. Real Python - Abstract Base Classes in Python
  3. GeeksforGeeks - Abstract Classes in Python