Ob'ektga yo'naltirilgan dasturlash yoki qisqacha OOP - bu dasturlash falsafasi. OOP ob'ektlarni dasturlarning asosiy birligi sifatida ko'radi. Ob'ektda operatsion ma'lumotlar uchun ma'lumotlar va funktsiyalar mavjud.

Jarayonga yo'naltirilgan dasturlash kompyuter dasturini buyruqlar to'plami, ya'ni funktsiyalar to'plamining ketma-ket bajarilishi sifatida ko'rib chiqadi. Dasturlashni soddalashtirish maqsadida jarayonga yo‘naltirilgan funksiyalarni kichik funksiyalarga bo‘lish davom ettiriladi, ya’ni tizimning murakkabligini kamaytirish uchun katta funksiyalar kichik funksiyalarga bo‘linadi.

Ob'ektga yo'naltirilgan dasturlash kompyuter dasturini ob'ektlar to'plami sifatida ko'rib chiqadi va har bir ob'ekt boshqa ob'ektlardan xabarlarni qabul qilishi va bu xabarlarni qayta ishlashi mumkin. Kompyuter dasturining bajarilishi ob'ektlar o'rtasida uzatiladigan xabarlar seriyasidir.

Python-da barcha ma'lumotlar turlarini ob'ektlar sifatida ko'rish mumkin va, albatta, ob'ektlar ham moslashtirilishi mumkin. Maxsus ob'ekt ma'lumotlar turi ob'ektga yo'naltirilgan sinf tushunchasidir.

Jarayonga yo'naltirilgan va ob'ektga yo'naltirilgan dastur oqimi o'rtasidagi farqni ko'rsatish uchun biz misoldan foydalanamiz.

Aytaylik, biz talabaning baholar ro'yxatini qayta ishlamoqchimiz. Talabaning bahosini ifodalash uchun jarayonga yo'naltirilgan dastur dict bilan ifodalanishi mumkin:

std1 = { 'name': 'Michael', 'score': 98 }
std2 = { 'name': 'Bob', 'score': 81 }

Talaba ballarini qayta ishlash funksiyalar orqali amalga oshirilishi mumkin, masalan, talabalar ballarini chop etish:

def print_score(std):
    print('%s: %s' % (std['name'], std['score']))

Agar biz ob'ektga yo'naltirilgan dasturlash g'oyalarini qabul qiladigan bo'lsak, bizning birinchi ustuvor vazifamiz dasturni bajarish jarayoni haqida o'ylash emas, balki Student ma'lumotlar turini ikkita atributga ega bo'lgan ob'ekt sifatida ko'rib chiqishdir: name va score. Agar siz talaba ballini chop qilmoqchi bo'lsangiz, avval talabaga mos keladigan ob'ektni yaratishingiz kerak, so'ngra ob'ekt o'z ma'lumotlarini chop etishi uchun ob'ektga print_score xabarini yuborishingiz kerak.

class Student(object):

def __init__(self, name, score):
        self.name = name
        self.score = score
    def print_score(self):
        print('%s: %s' % (self.name, self.score))

Ob'ektga xabar yuborish aslida ob'ektga mos keladigan bog'langan funktsiyani chaqirishdir, biz uni ob'ekt usuli deb ataymiz. Ob'ektga yo'naltirilgan dastur quyidagicha yoziladi:

bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()

Ob'ektga yo'naltirilgan dizayn g'oyasi tabiatdan kelib chiqadi, chunki tabiatda Class va Instance tushunchalari juda tabiiydir. Sinf mavhum tushunchadir. Misol uchun, biz belgilagan Sinf — Talaba talabalar tushunchasiga ishora qiladi, Instance esa aniq Talaba. Masalan, Bart Simpson va Liza Simpson ikkita o'ziga xos talabalardir.

Shuning uchun, ob'ektga yo'naltirilgan dizayn g'oyasi sinfni abstrakt qilish va Class asosida Instance yaratishdir.

Ob'ektga yo'naltirilgan mavhumlik darajasi funktsiyalarga qaraganda yuqoriroqdir, chunki sinf ma'lumotlar va operatsion ma'lumotlar usullarini o'z ichiga oladi.

Sinf va misol

Ob'ektga yo'naltirilganlikning eng muhim tushunchalari sinf va misoldir. Shuni esda tutish kerakki, sinf mavhum shablondir, masalan, Student sinfi va misol sinf asosida yaratilgan o'ziga xos "ob'ekt". Har bir ob'ekt bir xil usulga ega, lekin individual ma'lumotlar farq qilishi mumkin.

Hali ham Student sinfini misol sifatida olib, Pythonda sinfni aniqlash class kalit so'zi orqali amalga oshiriladi:

class Student(object):
    pass

class dan keyin darhol sinf nomi, ya'ni Student. Sinf nomi odatda bosh harf bilan boshlanadigan so'z bo'lib, undan keyin object qo'yiladi, bu sinf qaysi sinfdan meros bo'lganligini ko'rsatadi. Meros tushunchasi haqida keyinroq gaplashamiz. Agar tegishli meros klassi bo'lmasa, shunchaki object sinfidan foydalaning, ya'ni barcha sinflar oxir-oqibat meros qilib oladigan sinfdir.

Student sinfini aniqlagandan so'ng, Student sinfiga asoslangan holda Student misolini yaratishingiz mumkin. Misol yaratish sinf nomi + () orqali amalga oshiriladi:

>>> bart = Student()
>>> bart
<__main__.Student object at 0x10a67a590>
>>> Student
<class '__main__.Student'>

Ko'rib turganingizdek, bart o'zgaruvchisi Student misoliga ishora qiladi va keyingi 0x10a67a590 xotira manzilidir. Har bir ob'ektning manzili har xil va Student ning o'zi sinfdir.

Siz atributlarni misol o'zgaruvchisiga erkin bog'lashingiz mumkin. Masalan, name atributini bart misoliga bog'lang:

>>> bart.name = 'Bart Simpson'
>>> bart.name
'Bart Simpson'

Sinflar shablon sifatida ishlashi mumkinligi sababli, namuna yaratishda biz bog'lanishi kerak deb hisoblagan ba'zi atributlarni majburan to'ldirishimiz mumkin. Maxsus __init__ usulini belgilash orqali, misol yaratishda name, score va boshqa atributlar unga bog'lanadi:

class Student(object):

def __init__(self, name, score):
        self.name = name
        self.score = score
★ There are two underscores before and after the special method "__init__"! ! !

E'tibor bering, __init__ usulining birinchi parametri har doim self bo'lib, yaratilgan misolning o'zini ko'rsatadi. Shuning uchun, __init__ usulida siz self ga turli atributlarni bog'lashingiz mumkin, chunki self yaratilgan misolning o'ziga ishora qiladi.

__init__ usuli bilan misol yaratishda siz bo'sh parametrlarga o'ta olmaysiz. Siz __init__ usuliga mos keladigan parametrlarni kiritishingiz kerak, lekin self o'tish shart emas. Python tarjimoni misol o'zgaruvchilarining o'zida o'tadi:

>>> bart = Student('Bart Simpson', 59)
>>> bart.name
'Bart Simpson'
>>> bart.score
59

Oddiy funksiyalar bilan solishtirganda, sinfda aniqlangan funktsiyalar o'rtasidagi yagona farq shundaki, birinchi parametr har doim self misol o'zgaruvchisi bo'lib, qo'ng'iroq qilishda bu parametrni uzatish kerak emas. Bundan tashqari, sinf usullari oddiy funktsiyalardan farq qilmaydi, shuning uchun siz hali ham standart parametrlar, o'zgaruvchan parametrlar, kalit so'z parametrlari va nomlangan kalit so'z parametrlaridan foydalanishingiz mumkin.

Ma'lumotlarni inkapsulyatsiya qilish

Ob'ektga yo'naltirilgan dasturlashning muhim xususiyati ma'lumotlarni inkapsulyatsiya qilishdir. Yuqoridagi Student sinfida har bir misol o'zining name va score ma'lumotlariga ega. Biz bu maʼlumotlarga talaba bahosini chop etish kabi funksiyalar orqali kirishimiz mumkin:

>>> def print_score(std):
...     print('%s: %s' % (std.name, std.score))
...
>>> print_score(bart)
Bart Simpson: 59

Student misolining o'zi ushbu ma'lumotlarga ega bo'lganligi sababli, ushbu ma'lumotlarga kirish uchun unga tashqi funktsiyalardan kirishning hojati yo'q. Siz Student sinfidagi ma'lumotlarga kirish funktsiyasini to'g'ridan-to'g'ri belgilashingiz mumkin, shu bilan "ma'lumotlar" ni qamrab oladi. Ma'lumotlarni o'z ichiga olgan ushbu funktsiyalar Student sinfining o'zi bilan bog'liq bo'lib, biz uni sinf usullari deb ataymiz:

class Student(object):

def __init__(self, name, score):
        self.name = name
        self.score = score
    def print_score(self):
        print('%s: %s' % (self.name, self.score))

Usulni aniqlash uchun u oddiy funktsiya bilan bir xil, faqat birinchi parametr self. Usulni chaqirish uchun uni faqat misol o'zgaruvchisida to'g'ridan-to'g'ri chaqirishingiz kerak. self dan tashqari, uni topshirishingiz shart emas. Boshqa parametrlar odatda qabul qilinadi:

>>> bart.print_score()
Bart Simpson: 59

Shu tarzda, Student sinfiga tashqaridan qaraganimizda, biz faqat name va score misol yaratish uchun berilishi kerakligini bilishimiz kerak va qanday chop etish Student sinf ichida aniqlangan. Ushbu ma'lumotlar va mantiq "kapsullangan". Qo'ng'iroq qilish oson, lekin ichki amalga oshirish tafsilotlarini bilishingiz shart emas.

Inkapsulyatsiyaning yana bir afzalligi shundaki, siz Student sinfiga yangi usullarni qo'shishingiz mumkin, masalan, get_grade:

class Student(object):
    ...

def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

Xuddi shu get_grade usulini to'g'ridan-to'g'ri misol o'zgaruvchisida ichki amalga oshirish tafsilotlarini bilmasdan chaqirish mumkin:

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

Kirish parametrlari:

lisa = Student('Lisa', 99)
bart = Student('Bart', 59)
print(lisa.name, lisa.get_grade())
print(bart.name, bart.get_grade())

Ishlash natijasi:

Lisa A
Bart C