Python / Класс ба OOP үндэс

Класс ба OOP үндэс

Одоог хүртэл бид өгөгдөл (хувьсагч) ба үйлдэл (функц)-ийг тустусад нь бичиж ирлээ. Object-Oriented Programming (OOP) бол эдгээрийг нэгтгэж, бодит ертөнцийн объектыг кодод дүрслэх арга юм. Python бол OOP-г бүрэн дэмждэг хэл.

Класс гэж юу вэ?

Класс бол объект үүсгэх загвар (blueprint) юм. Жишээлбэл Оюутан класс нь нэр, оноо зэрэг шинж чанар (attribute) болон суралцах, шалгалт өгөх зэрэг үйлдэл (method)-тэй байна.

python
class Оюутан:
    def __init__(self, нэр: str, нас: int) -> None:
        self.нэр = нэр
        self.нас = нас
        self.оноо = 0

    def мэндчилэх(self) -> str:
        return f"Сайн уу! Миний нэр {self.нэр}, {self.нас} настай."

    def оноо_нэмэх(self, оноо: int) -> None:
        self.оноо += оноо
        print(f"{self.нэр}{оноо} оноо нэмэгдлээ. Нийт: {self.оноо}")

Класс үүсгэн объект буюу instance үүсгэнэ:

python
болд = Оюутан("Болд", 20)
сарнай = Оюутан("Сарнай", 22)

print(болд.мэндчилэх())    # Сайн уу! Миний нэр Болд, 20 настай.
болд.оноо_нэмэх(10)        # Болд-д 10 оноо нэмэгдлээ. Нийт: 10
сарнай.оноо_нэмэх(25)      # Сарнай-д 25 оноо нэмэгдлээ. Нийт: 25

болд ба сарнай хоёул Оюутан классаас үүссэн боловч тусдаа объект — нэг нь нөгөөд нөлөөлөхгүй.

__init__ метод

__init__ бол объект үүсэх үед автоматаар дуудагддаг тусгай метод. Англиар constructor гэж нэрлэдэг. self гэдэг нь тухайн объект өөрийгөө заадаг заагч — бүх методод заавал эхний параметр байна.

python
class Бүтээгдэхүүн:
    def __init__(self, нэр: str, үнэ: float, тоо: int) -> None:
        self.нэр = нэр
        self.үнэ = үнэ
        self.тоо = тоо

    def нийт_үнэ(self) -> float:
        return self.үнэ * self.тоо

    def мэдээлэл(self) -> str:
        return f"{self.нэр}: {self.үнэ}₮ × {self.тоо} = {self.нийт_үнэ()}₮"


алим = Бүтээгдэхүүн("Алим", 500.0, 3)
сүү = Бүтээгдэхүүн("Сүү", 2800.0, 2)

print(алим.мэдээлэл())   # Алим: 500.0₮ × 3 = 1500.0₮
print(сүү.мэдээлэл())    # Сүү: 2800.0₮ × 2 = 5600.0₮

Class attribute ба Instance attribute

Instance attribute нь тухайн объектод л хамаарна. Class attribute нь бүх объектод хамтарч хамаарна:

python
class Дугуй:
    тойрог_тооцоо = 3.14159   # class attribute — бүгдэд нийтлэг

    def __init__(self, радиус: float) -> None:
        self.радиус = радиус   # instance attribute — өөрийн гэсэн

    def талбай(self) -> float:
        return Дугуй.тойрог_тооцоо * self.радиус ** 2


жижиг = Дугуй(3)
том = Дугуй(10)

print(f"Жижиг дугуйн талбай: {жижиг.талбай():.2f}")   # 28.27
print(f"Том дугуйн талбай: {том.талбай():.2f}")         # 314.16

OOP нь кодыг бодит ертөнцийн логикт ойртуулж, уншихад хялбар, дахин ашиглахад тохиромжтой болгодог. Том төслүүд дээр энэ арга барил зайлшгүй хэрэгтэй.

Дараагийн хичээлд:

OOP-ийн хамгийн хүчирхэг ойлголтуудын нэг — өвлөлт (inheritance)-ийг сурна. Нэг классын шинж чанар, методуудыг нөгөө класс хэрхэн өвлөн авч, өргөтгөдгийг үзнэ.