Python [Inheritance, Incapsulation, Polymprphism]

Python Inheritance - Pythonda "meros olish"

Inheritance yani meros olish bu, biror asosiy klassdan boshqa bir maxsus klass yaratish, shu blan birga asosiy klassning barcha metod va attributlarini o'zida jam qilish.

UML da inheritance ushbu ko'rinishda namoyon bo'ladi:

Python-da hamma narsa obyektdir. Modullar obyekt, klasslar va funktsiyalar obyektlardir va albatta, klasslardan yaratilgan obyektlar ham obyektlardir.

Inheritance har qanday OO dasturlash tilining asosiy xususiyatidir. Python bir vaqtning o'zida bir nechta inheritance amalga oshira oladigan sanoqli dasturlash tillaridan biridir.

Pythonda yangi klass yaratganimizda ham beihtiyor inheritance ni ham ishlatamiz. Keling bu nimani anglatishini ko'rib chiqamiz:

Python shellni ochamiz va bitta bo'sh klass yaratamiz:

>>> class MyClass:
...     pass
...

Hech ish qilmaydigan klass yaratdik, boshqa bir klassdan inherit ham qilmadik, keling dir() funksiyasi orqali uning metodlarini sanab ko'ramiz:

>>> c = MyClass()
>>> dir(c)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', '__weakref__']

dir() barcha klassga tegishli metodlarni sanab chiqdi, lekin biz birorta metod yaratmagan edik, unda shuncha metod qayerdan keldi, shell orqali barcha metodlar python object() dan kelayotganini ko'rishimiz mumkin:

>>> o = object()
>>> dir(o)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__']

Etibor bersangiz dir() funksiyasi ko'rsatayotgan ikkita list deyarli bir xil, faqat __ dict __ va __ weakref __ metodlari myClass da qo'shimcha.

Shundan bilishimiz mumkinki pythonda istalgan klass Python object dan inherit qiladi, va qonuniy ushbu ko'rinishda yozish ham mumkin class myClass(object): lekin bu qo'pol hamda zarur emas.

Inheritancega misol:

Polygon bu uchda yoki undan ortiq tomonga ega yopiq ikki o'lchamli shakldir, shundan kelib chiqib polygon klassini yasaymiz:

class Polygon:
    def __init__(self, no_of_sides):
        self.n = no_of_sides
        self.sides = [0 for i in range(no_of_sides)]

    def inputSides(self):
        self.sides = [float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)]

    def dispSides(self):
        for i in range(self.n):
            print("Side",i+1,"is",self.sides[i])

Uchburchak bu uchta tomoni bor polygondir, demak u polygonning barcha qoidalariga bo'ysunadi, shunday ekan biz Polygon klassdan inherit qilgan holda Uchburchak klassni yaratsak bo'ladi, shunda polygonning barcha metod va atributlari Uchburchak klassda namoyon bo'ladi:

class Triangle(Polygon):
    def __init__(self):
        Polygon.__init__(self,3)

    def findArea(self):
        a, b, c = self.sides
        # calculate the semi-perimeter
        s = (a + b + c) / 2
        area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
        print('The area of the triangle is %0.2f' %area)
 

Uchburchak klassimizda endi qo'shimcha findArea() degan metod bor. Biz ushbu metodni ishlatib uchburchak yuzasini topishimiz mumkin:

>>> t = Triangle()

>>> t.inputSides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4

>>> t.dispSides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0

>>> t.findArea()
The area of the triangle is 6.00

Ko'rib turganingizde biz Uchburchak klassda inputSides() yoki dispSides() metodlarini yaratmagan bo'lsakda ularni ishlata oldik, aynan mana shu inheritance yani meros olish deyiladi.

Incapsulation - Enkapsulyatsiya

Enkapsulyatsiya Pythonda malumot va metodlarni bitta yaxlit konteyner ichiga solishdir. Misol uchun biz klass yaratdik, demak biz shu vaqtning o'zida enkapsulyatsiyani ishlatdik. Sababi klass o'zining metod va atributlarini bitta yaxlit konteyner ichiga oladi, yani o'zining ichiga. Klassdan tashqarida esa klassning metod va atributlari yashirindir.

Obyektga yo'naltirilgan dasturlash tillari funksiya va malumotlarning oson va samarali enkapsulyatsiyani taqdim qiladi. Natija sizfatida, bir biriga bog'liq malumot va funksiyalarning atrofida mantiqan tashqi dunyodan ajratib turuvchi chiziq tortiladi. Shu chiziqdan tashqarida faqat klassning interfeysi ochiq va uning pablik metodlari va atributlari ochiq, boshqa barcha malumot va funksiyalar himoyalangan hisoblanadi. Biz bu konsepsiyaga pablik funksiyalar va yashirin atributlarni misol qilishimiz mumkin.

Polymorphism - Polimorfizm

Polimorfizm so'zi bir nechta formasi yani bir nechta turi mavjud degani. Dasturlashda, polimorfizm bitta funksiya nomi bir nechta turdagi obyektlari uchun ishlatilishi tushuniladi.