inkapsulyasiya metodlari
![REJA:
1. KIRISH
2. INKAPSULYATSIYA
3. KLASSNING XUSUSIYATLARI VA METODLARI
4. KLASSNING XUSUSIYATLARINI INKAPSULYATSIYA QILISH](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_1.png)
![KIRISH
O‘zbekiston Respublikasi Prezidenti Shavkat Mirziyoyev O‘zbekiston
Respublikasi Konstitutsiyasi qabul qilinganining 24 yilligiga bag‘ishlangan
tantanali marosimdagi ma’ruzasida “Biz ta’lim va tarbiya tizimining barcha
bo‘g‘inlari faoliyatini bugungi zamon talablari asosida takomillashtirishni
o‘zimizning birinchi darajali vazifamiz deb bilamiz”, - deb ta’kidlagan edilar.
Kelajagi buyuk davlatni qurish tafakkuri, dunyoqarashi o‘zgargan xodimlarimiz,
mutaxassislarimizga ko‘p jixatdan bog‘liqdir. Yangicha fikrlaydigan, bozor
sharoitlarida muvaffaqiyatli xo‘jalik yuritadigan, yuksak malakali, chuqur bilimli
mutaxassislarni tayyorlash davr talabi bo‘lib qoldi. Mamlakatimiz rivojlangan
davlatlar qatoridan mustaxkam o‘rin egallashi uchun zamonaviy kompyuter
texnologiyalarini xayotimizning barcha jabxalariga keng joriy etib kelinmoqda.
Xozirgi vaqtda kompyuter texnologiyalari rivojlanib borayotgan vaqtda asosiy
e`tibor foydalanuvchilarga emas, dasturchilarga qaratilmoqda. Shuni hisobga olib,
talabalarda dasturlar tuzish ko‘nikmalarini hosil qilish va ularda kerakli amaliy
dasturlarni yarata olish imkoniyati shakllantirishga katta e`tibor berilmoqda.
O‘zbekiston Respublikasi Kadrlar Tayyorlash Milliy dasturida ham yosh avlodni
yangi kompyuter texnologiyalarini egallashi, ularning bilimlarini chet el talabalari
saviyasiga etkazish dolzarb masala qilib qo‘yilgan. So‘ngi yillarda kompyuterning
dasturiy ta’minoti rivojlanishi asosiy yo‘nalishlaridan biri bu obyektga
yo‘naltirilgan dasturlash sohasi bo‘ldi. Obektga yo‘naltirilgan operatsion tizimlar
(Masalan, Windows), amaliy dasturlar va obyektga yo‘naltirilgan dasturlash
tizimlari ham ommaviylashdi. Birinchi obyektga yo‘naltirilgan dasturlash elementi
Simula-67 (1967 y., Norvegiya) tili bo‘ldi. Turbo PASCAL ning 5,5 versiyasidan
boshlab obyektga yo‘naltirilgan dasturlash vositalari paydo bo‘ldi. Turbo PASCAL
ning rivoji yakuni sifatida BORLAND filmasi tomonidan DELPHI dasturlash
tizimi yaratilishi bo‘ldi. Ushbu tizim yordamida tez va oson murakkab bo‘lgan
grafik interfeysni 10 dasturlash imkoniyati mavjud. 1991- yilda Visual BASIC
ning I versiyasidan boshlab bu til to‘laligicha obyektga yo‘naltirildi (1997- yil).
Obyektga yo‘naltirilgan dasturlash tillaridan yana biri 1995- yilda Jeyms Gosling
boshchiligida Sun Microsystems kompaniyasida yaratilgan JAVA tilidir. Uni
ishlab chiqishda maxsus o‘rganish talab qilmaydigan, sodda tilni maqsad qilingan.
JAVA tili maksimal darajada C ++ tiliga o‘xshash bo‘lishi uchun yaratilgan. JAVA
Internet uchun dasturlar tayyorlashning ideal vositasidir. So‘ngi yillarda Microsoft
kompaniyasi tomonidan C++ davomchisi sifatida C # (Ci sharp) tili yaratildi.
1985- yilda Bell Labs (AQSh) laboratoriyasi C++ dasturlash tili yaratilganligini
xabarini berdi. Bugungi kunda bu til obyektga yo‘naltirilgan dasturlash tillari
orasida mashhurdir. Bu til yordamida istalgan mashina uchun – shaxsiydan to
superkompyuterlargacha dasturlar yozish mumkin. Bu tilning asoschisi Born
Straustrupdir](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_2.png)
![INKAPSULYATSIYA
Obyektga Yo'naltirilgan Dasturlashning tamoyillaridan biri bu inkapsulyatsiya,
ya'ni obyektning xususiyatlarga to'g'ridan-to'g'ri (nuqta orqali) murojat qilishni va
ularning qiymatini o'zgartirishni taqiqlab qo'yish. Pythonda bunday yopiq
xususiyatlarning nomi ikki pastki chiziq bilan boshlanadi:
from uuid import uuid4
class Avto: Dasturda ob’ekt komponentasiga quyidagicha murojat kilish
mumkin:
Sinf-nomi.ob’ekt-nomi :: komponenta-nomi yoki soddarok holda
Ob’ekt-nomi. Element-nomi
Misol uchun:
x.real=1.24;
x.imag=0.0;
dim[3]. Real=0.25;
dim[3]. Imag=0.0;
Sinfga tegishli funksiyalarga quyidagicha murojat qilinadi:
ob’ekt-nomi. funksiya-nomi
Misol uchun:
X. define(0.9) (Bu holda real=0.9 va imag=0.0)](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_3.png)
![X. define(4.3,20.0) (Bu holda kompleks son 4.3+i*20.0)
Display funksiyasi ekranda kompleks son qiymatlarini tasvirlaydi.
Komponenta o‘zgaruvchilar va komponenta funksiyalar.Sinf
kompanenta o‘zgaruvchilari sifatida o‘zgaruvchilar , massivlar, ko‘rsatkichlar
ishlatilishi mumkin. Elementlar ta’riflanganda initsializatsiya kilish mumkin
emas. Buning sababi shuki sinf uchun xotiradan joy ajratilmaydi. Kompanenta
elementlariga kompanenta funksiyalar orkali murojat qilinganda faqat nomlari
ishlatiladi Sinfdan tashqarida sinf elementlariga emas
ob’ekt elementlariga murojat kilish mumkin . Bu murojat ikki xil bo‘lishi
mumkindir.
Ob’ekt- nomi . Element - nomi.
Sinf elementlari sinfga tegishli funksiyalarida ishlatilishidan oldin
ta’riflangan bo‘lishi shart emas. Xuddi shunday bir funksiyadan xali ta’rifi
berilmagan ikkinchi funksiyaga murojaat kilish mumkin.
Komponentalarga murojaat xukuklari. Komponentalarga murojaat xuquqi
murojaat spetsifikatorlari yordamida boshkariladi. Bu spetsifikatorlar:
Protected – ximoyalangan;
Private – xususiy;
Public – umumiy;
Ximoyalangan kompanentalardan sinflar ierarxiyasi qurilganda foydalaniladi.
Oddiy holda Protected spetsifikatori Private spetsifikatoriga ekvivalentdir.
Umumiy ya’ni Public tipidagi komponentalarga dasturning ixtiyoriy joyida
murojaat kilinishi mumkin.
Xususiy ya’ni Private tipidagi komponentalarga sinf tashqarisidan murojaat
qilish mumkin emas. Agar sinflar Struct xizmatchi so‘zi bilan kiritilgan bo‘lsa,
uning hamma komponentalari umumiy Public bo‘ladi, lekin bu xuquqni murojaat
spetsifikatorlari yordamida o‘zgartirish mumkin.](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_4.png)
![Agar sinf Class xizmatchi so‘zi orkali ta’riflangan bo‘lsa, uning hamma
komponentalari xususiy bo‘ladi. Lekin bu xuquqni murojaat spetsifikatorlari
yordamida o‘zgartirish mumkindir.
Bu spetsifikator yordamida sinflar umumiy holda quyidagicha ta’riflanadi:
class class_name
{
int data_member; // Ma’lumot-element
void show_member(int); // Funksiya-element
};
"""Avtomobil klassi"""
def __init__(self,make,model,rang,yil,narh,km=0):
"""Avtomobilning xususiyatlari"""
self.make = make
self.model = model
self.rang = rang
self.yil = yil
self.narh = narh
self.__km = km
self.__id = uuid4()
def get_km(self):
return self.__km
def get_id(self):
return self.__id
Yuqoridagi kodimizning 11-qatorida __km xususiyati avtomobilning necha km
yurgani haqida ma'lumot saqlaydi va bu ma'lumotni tashqaridan o'zgartirib
bo'lmaydi. Kodimizning 12-qatorida esa har bir yangi yaratilgan avtomobilga
yangi, noyob va takrorlanmas ID generasiya qilish uchun uuid4() funksiyasidan
foydalanayapmiz. Deylik biz mashinalar sotish uchun onlayn bozor yaratsak,
bozorimizga qo'shilgan har bir moshina endi o'zining ID raqamiga ega bo'ladi va
bu ID raqamni to'g'ridan-to'g'ri (nuqta orqali) ko'rib bo'lmaydi.
avto1 = Avto("GM","Malibu","Qora",2020,40000,100000)
avto1.__km
Natija: AttributeError: 'Avto' object has no attribute '__km'
Yopiq xususiyatlarni ko'rish uchun esa alohida metodlar yozish maqsadga muvofiq
bo'ladi (get_km() va get_id()):
print(f"ID: {avto1.get_id()}")
Natija: ID: 1d4f39a4-3222-4682-9231-6275ca5e1bff
Bunday yopiq xususiyatlarni o'zgartirish ham metodlar orqali amalga oshirilishi
kerak. Misol uchun mashinaning necha km yurganini o'zgartirish uchun
klassimizga quyidagi metodni qo'shamiz:
def add_km(self,km):
"""Mashinaning km ga yana km qo'shish"""
if km>=0:](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_5.png)
![self.__km += km
else:
print("Mashina km kamaytirib bo'lmaydi")
avto1.add_km(1500)
print(avto1.get_km())
Natija: 101500
Inkapsulyatsiyaning maqsadi obyektning ma'lum xususiyatlarini tashqi ta'sirdan
himoya qilish. Misol uchun yuqoridagi misolimizda mashinaning qancha yurganini
faqat musbat tarafga o'zgartirish mumkin, noyob ID raqamini esa umuman
o'zgartirib bo'lmaydi.
KLASSNING XUSUSIYATLARI VA METODLARI
Avvalgi darslarimizda biror klassdan yaratilgan har bir obyektning xususiyatlarini
klass ichidagidef __init__() medoti yordamida berayotgan edik. Bu metod qanday
ishlaydi? Biz har gal klassga murojat qilganimizda klass aynan shu
__init__metodini ishga tushiradi va biz bergan xususiyatlar bilan yangi obyekt
yaratadi.
Pythonda xususiyatlarni nafaqat obyektga balki to'g'ridan-to'g'ri klassga ham
yuklash imkoniyati mavjud. Bunda klassning xususiyatiga berilgan qiymat barcha
obyektlar uchun umumiy bo'ladi. Bu xususiyatni bir obyekt orqali o'zgartirilganda
shu klassga oid barcha obyektlarda ham uning qiymati o'zgaradi.
Klassga oid xususiyatlar def __init__() metodidan avval e'lon qilinadi.
Keling tushunarli bo'lishi uchun quyidagi misolni ko'ramiz:
class Avto: Quyidagi misolda employee, sinfi kiritilgandir:
class employee
{
public:
long employee_id;
float salary;
void show_employee(void)
{](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_6.png)
![cout<<"Nomer: "<<employee_id<<endl;
cout<<"Maosh: "<<salary<<endl;
};
};
Bu sinf ikki o‘zgaruvchi va bitta funksiya-elementga ega.
Quyidagi dastur ikki employee ob’ektini yaratadi. Nuqta operatordan
foydalanib ma’lumot elementlarga qiymat beriladi
so‘ngra show_employee elementidan foydalanib xizmatchi xakidagi ma’lumot
ekranga chikariladi:
#include <iostream>
using namespace std;
class employee
{
public:
long employee_id;
float salary;
void show_employee(void)
{
cout<<"Nomer: "<<employee_id<<endl;
cout<<"Maosh: "<<salary<<endl;](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_7.png)
![};
};
int main()
{
employee worker, boss;
worker.employee_id = 12345;
worker.salary = 25000;
boss.employee_id = 101;
boss.salary = 101101.00;
cout<<"\n"<<"ishchi"<<endl;
worker.show_employee();
cout<<"\n"<<"boss"<<endl;
boss.show_employee();
return 0;
}
"""Avtomobil klassi"""
num_avto = 0
def __init__(self,make,model,rang,yil,narh,km=0):
"""Avtomobilning xususiyatlari"""](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_8.png)
![self.make = make
self.model = model
self.rang = rang
self.yil = yil
self.narh = narh
self.__km = km
self.__id = uuid4()
Avto.num_avto += 1
Kodni tahlil qilamiz:
1-qatroda Avto klassini e'lo qildik
3-qatorda Avto klassiga oid bo'lgan xususiyat num_avto yaratdik va unga 0
qiymatini berdik
Keyingi qatorlarda __init__ metodi yordamida klassdan yaratiladigan
obyektlarning xususiyatlarini e'lon qildik va har gal bu metdoga murojat
qilingandan num_avto ning qiymatini 1 ga oshradigan qilib qo'ydik (13-
qator).
Yuqoridagi usul bilan endi biz dastur davomida Avto klassidan jami nechta
obyektlar yaratilganini kuzatib borishimiz mumkin bo'ladi. Bunda num_avto
o'zgaruvchisiga istalgan obyekt orqali yoki klass nomi orqali murojat qilish
mumkin:
avto1 = Avto("GM","Malibu","Qora",2020,40000)
avto2 = Avto("GM","Lacetti","Oq",2020,20000)
print(avto1.num_avto)
Natija: 2
avto3 = Avto("Toyota",'Carolla',"Silver",2018, 45000)
print(Avto.num_avto)
Natija: 3
KLASSNING XUSUSIYATLARINI INKAPSULYATSIYA QILISH
Klassga oid xususiyatlar ham huddi yuoqridagi kabi nomidan avval ikki pastki
chiziq qo'shish bilan inkapsulyatsiya qilinadi:
class Avto: Komponenta funksiya ta’rifi. Komponenta funksiya albatta sinf
tanasida ta’riflangan bo‘lishi lozim. Global funksiyalardan farqli komponenta
funksiya sinfning hamma komponentalariga murojat qilishi mumkin. Funksiyaning
faqat prototipi emas to‘la ta’rifi sinf tanasida joylashgan bo‘lsa, bu funksiya
joylashtiruvchi (inline) funksiya hisoblanadi. Ma’lumki inline
funksiyalardassikllar, kalit bo‘yicha o‘tish operatori ishlatilishi mumkin emas.
Bundan tashqari bunday funksiyalar rekursiv funksiya bo‘lolmaydi. Bu
chegaralarni engish uchun sinf tanasiga faqat funksiya prototipi joylashtirilib,
funksiyaning to‘la ta’rifi sinf tashqarisida dasturga kiruvchi boshqa funksiyalar](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_9.png)
![bilan birga beriladi. Komponenta funksiyani sinf tashqarisida ta’riflanganda, qaysi
sinfga tegishli ekanligini quyidagi shaklda ko‘rsatiladi:
Sinf-nomi :: Komponenta funksiya-nomi
Sinf tanasiga komponenta funksiya prototipi quyidagi shaklda joylashtiriladi:
Tip funksiya-nomi(formal-parametrlar-ta’rifi)
Sinf tashqarisida funksiya quyidagi shaklda ta’riflanadi:
Tip sinf-nomi :: funksiya-nomi(formal-parametrlar-spetsifikatsiyasi)
{ funksiya tanasi };
Oldingi misoldagi employee sinfida funksiya sinf ichida ta’riflangan. Bunday
funksiya joylanuvchi (inline) funksiya deb qaraladi.
Funksiyani sinf tashqarisida ta’riflab sinf ichiga funksiya prototipini
joylashtirish mumkin. Sinf ta’rifi bu holda quyidagi ko‘rinishda bo‘ladi:
class employee
{
public:
long employee_id;
float salary;
void show_employee(void);
};
Har xil funksiyalar bir xil nomli funksiyalardan foydalanishi mumkin bo‘lgani
uchun funksiya nomi sinf nomi va global ruxsat operatori belgisi (::) qo‘yilishi
lozim.](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_10.png)
![void employee::show_employee(void)
{
cout<<"Nomer: "<<employee_id<<endl;
cout<<"Maosh: "<<salary<<endl;
};
Funksiya sinf tashqarisida ta’riflangan bo‘lsa ularni inline funksiya sifatida
qarash uchun funksiya ta’rifida inline so‘zi aniq ko‘rsatilgan bo‘lishi kerak.
Quyidagi dastur show_employee funksiyasi ta’rifini sinf tashqarisiga
joylashtiradi va inline so‘zi anik ko‘rsatiladi:
#include <iostream>
using namespace std;
class employee
{
public:
long employee_id;
float salary;
void show_employee(void);
};
inline void employee::show_employee(void)](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_11.png)
![{
cout<<"Nomer: "<<employee_id<<endl;
cout<<"Maosh: "<<salary<<endl;
};
int main()
{
employee worker, boss;
worker.employee_id = 12345;
worker.salary = 25000;
boss.employee_id = 101;
boss.salary = 101101.00;
cout<<"\n"<<"ishchi"<<endl;
worker.show_employee();
cout<<"\n"<<"boss"<<endl;
boss.show_employee();
return 0;](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_12.png)
![}
"""Avtomobil klassi"""
__num_avto = 0 # klassga oid xususiyat
def __init__(self,make,model,rang,yil,narh):
"""Avtomobilning xususiyatlari"""
self.make = make
self.model = model
self.rang = rang
self.yil = yil
self.narh = narh
Avto.__num_avto += 1
KLASSGA OID METODLAR
Klasslarning o'ziga xos metodlari ham bo'lishi mumkin. Misol uchun yuqoridagi
num_avto xususiyatini ko'rish uchun alohida metod yozishimiz mumkin. Klassga
oid metodlar @classmethod dekoratori bilan boshlanadi va obyektga oid
metodlardan farqli ravishda self emas cls (class) argumentini qabul qiladi.
class Avto: Ko‘zda tutilgan holda parametrsiz konstruktor va quyidagi tipdagi
nusxa olish konstruktorlari yaratiladi: T :: T (const T&)
Misol uchun
class F
{...
public : F(const T&)
...
}
Ob’ektlar massivi ko‘zda tutilgan konstruktor tomonidan, yoki har bir
element uchun konstruktor chaqirish yo‘li bilan initsializatsiya qilinishi mumkin.](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_13.png)
![class complex a[20]; //ko‘zda tutilgan parametrsiz konstruktorni chaqirish
class complex b[2]={complex(10),complex (100)};
//oshkor chaqirish
Quyidagi misolda player, sinfi kiritiladi. Dasturda sinf
funksiyasi show_player va konstruktor tashqarisida ta’riflanadi.
So‘ngra player tipidagi ikki massiv yaratilib, har biri xakidagi ma’lumot ekranga
chikariladi
Initsializatorlar ro‘yxati. Konstruktor yordamida ob’ekt ma’lumotlarni
initsiyalizatsiyalashni ikkita usuli mavjud.
Birinchi usulda parametrlar qiymatlari konstruktor tanasiga uzatiladi. Ikinchi
usulda esa ushbu sinfdagi initsializatorlar ro‘yxatidan foydalanish nazarda tutilgan.
Bu ro‘yxat parametrlar ro‘yxati va konstruktor tanasi orasiga joylashadi.
Ro‘yxatdagi har bir initsializator konkret aniq komponentaga bog‘liq va quyidagi
ko‘rinishga ega:
<nom> (<ifoda>)
Destruktorlar. Sinfning biror ob’ekti uchun ajratilgan xotira ob’ekt
yukotilgandan so‘ng bo‘shatilishi lozimdir.
Sinflarning maxsus komponentalari destruktorlar, bu vazifani avtomatik
bajarish imkonini yaratadi.
"""Avtomobil klassi"""
__num_avto = 0
def __init__(self,make,model,rang,yil,narh,km=0):
"""Avtomobilning xususiyatlari"""
self.make = make
self.model = model
self.rang = rang
self.yil = yil
self.narh = narh
self.__km = km
self.__id = uuid4()
Avto.__num_avto += 1](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_14.png)
![@classmethod
def get_num_avto(cls):
return cls.__num_avto
Klass metodlarga klassning nomi orqali murojat qilinadi:
avto1 = Avto("GM","Malibu","Qora",2020,40000)
avto2 = Avto("GM","Lacetti","Oq",2020,20000)
avto3 = Avto("Toyota",'Carolla',"Silver",2018, 45000)
print(Avto.get_num_avto())
Natija: 3
@classmethod bu maxsus dekorator. Dekoratorlar bu o'z ichiga funksiya oluvchi
funksiyalar. Dekoratorlar haqida keyingi darslarimizning birida batafsil
to'xtalamiz.
KLASSLARNI MODULGA AJRATISH
Vaqt o'tishi bilan dasturimizda klasslar ko'payib borishi tabiiy. Bizning asosiy
dasturimiz uzun va chigal bo'lmasligi uchun klasslarni ham huddi funksiyalar kabi
alohida modullarga ajratish maqsadga muvofiq bo'ladi. Dastur davomida kerak
bo'ladigan klasslarga esa modulni chaqirish (import) orqali murojat qilishimiz
mumkin. Bunda, bir-biriga bog'liq klasslarni bitta faylga joylashimiz mumkin.
Misol uchun, biz Talaba, Professor, Foydalanuvchi va Shaxs degan klasslarni bitta
odamlar.py moduliga, Avto, Bus, Train degan klasslarni esa boshqa transport.py
moduliga joyladik. Kelajakda biz bu klasslarga import orqali murjat qilishimiz
mumkin.
BITTA KLASSNI IMPORT QILISH
Moduldan bitta klass import qilish uchun from modul import klass ifodasidan
foydalanamiz:
from odamlar import Talaba
from transport import Avto
talaba = Talaba("Alijon","Valiyev","FA010101","N00022")
avto = Avto("GM","Malibu","Qora",2020,40000)
BIR NECHTA KLASSLARNI IMPORT QILISH
Moduldan bir nechta klass chaqirish talab qilinsa, import so'zidan so'ng klasslar
ketma-ket vergul bilan ajratib yoziladi:
from odamlar import Talab, Shaxs
talaba = Talaba("Alijon","Valiyev","FA010101","N00022")
shaxs = Shaxs("Hasan","Husanov","FB0011223")
MODULNI O'ZINI CHAQIRISH
Modulni to'liq import qilish uchun import modul ifodasidan foydalanamiz. Bunda
modul ichidagi klasslarga modul nomi va nuqta orqali murojat qilinadi:](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_15.png)
![import odamlar
talaba = odamlar.Talaba("Alijon","Valiyev","FA010101","N00022")
shaxs = odamlar.Shaxs("Hasan","Husanov","FB0011223")
Moduldagi barcha klasslar quyidagicha import qilinadi: from modul import
*. Bunda modul ichidagi istalgan klassga to'g'ridan-to'g'ri uning nomi bilan
murojat qilinadi.
from odamlar import *
talaba = Talaba("Alijon","Valiyev","FA010101","N00022")
shaxs = Shaxs("Hasan","Husanov","FB0011223")
Bu usul 2 sababga ko'ra tavsiya qilinmaydi:
1. 1.
Dasturni kelajakda qayta ochganimizda, dastur davomida moduldagi aynan
qaysi klasslardan foydalanganimizni bir qarashda bilib bo'lmaydi
2. 2.
Agar modul juda katta bo'lsa, uning ichidagi ba'zi klasslar biz o'zimiz
yaratgan klasslar bilan nomi bir hil bo'lib qolish ehtimoli bor. Bu esa o'z
navbatida dastrumiz xato ishlashiga olib keladi.](/data/documents/c37ee6fb-9fa8-4b07-bf06-dcd68ab8df00/page_16.png)
REJA: 1. KIRISH 2. INKAPSULYATSIYA 3. KLASSNING XUSUSIYATLARI VA METODLARI 4. KLASSNING XUSUSIYATLARINI INKAPSULYATSIYA QILISH
KIRISH O‘zbekiston Respublikasi Prezidenti Shavkat Mirziyoyev O‘zbekiston Respublikasi Konstitutsiyasi qabul qilinganining 24 yilligiga bag‘ishlangan tantanali marosimdagi ma’ruzasida “Biz ta’lim va tarbiya tizimining barcha bo‘g‘inlari faoliyatini bugungi zamon talablari asosida takomillashtirishni o‘zimizning birinchi darajali vazifamiz deb bilamiz”, - deb ta’kidlagan edilar. Kelajagi buyuk davlatni qurish tafakkuri, dunyoqarashi o‘zgargan xodimlarimiz, mutaxassislarimizga ko‘p jixatdan bog‘liqdir. Yangicha fikrlaydigan, bozor sharoitlarida muvaffaqiyatli xo‘jalik yuritadigan, yuksak malakali, chuqur bilimli mutaxassislarni tayyorlash davr talabi bo‘lib qoldi. Mamlakatimiz rivojlangan davlatlar qatoridan mustaxkam o‘rin egallashi uchun zamonaviy kompyuter texnologiyalarini xayotimizning barcha jabxalariga keng joriy etib kelinmoqda. Xozirgi vaqtda kompyuter texnologiyalari rivojlanib borayotgan vaqtda asosiy e`tibor foydalanuvchilarga emas, dasturchilarga qaratilmoqda. Shuni hisobga olib, talabalarda dasturlar tuzish ko‘nikmalarini hosil qilish va ularda kerakli amaliy dasturlarni yarata olish imkoniyati shakllantirishga katta e`tibor berilmoqda. O‘zbekiston Respublikasi Kadrlar Tayyorlash Milliy dasturida ham yosh avlodni yangi kompyuter texnologiyalarini egallashi, ularning bilimlarini chet el talabalari saviyasiga etkazish dolzarb masala qilib qo‘yilgan. So‘ngi yillarda kompyuterning dasturiy ta’minoti rivojlanishi asosiy yo‘nalishlaridan biri bu obyektga yo‘naltirilgan dasturlash sohasi bo‘ldi. Obektga yo‘naltirilgan operatsion tizimlar (Masalan, Windows), amaliy dasturlar va obyektga yo‘naltirilgan dasturlash tizimlari ham ommaviylashdi. Birinchi obyektga yo‘naltirilgan dasturlash elementi Simula-67 (1967 y., Norvegiya) tili bo‘ldi. Turbo PASCAL ning 5,5 versiyasidan boshlab obyektga yo‘naltirilgan dasturlash vositalari paydo bo‘ldi. Turbo PASCAL ning rivoji yakuni sifatida BORLAND filmasi tomonidan DELPHI dasturlash tizimi yaratilishi bo‘ldi. Ushbu tizim yordamida tez va oson murakkab bo‘lgan grafik interfeysni 10 dasturlash imkoniyati mavjud. 1991- yilda Visual BASIC ning I versiyasidan boshlab bu til to‘laligicha obyektga yo‘naltirildi (1997- yil). Obyektga yo‘naltirilgan dasturlash tillaridan yana biri 1995- yilda Jeyms Gosling boshchiligida Sun Microsystems kompaniyasida yaratilgan JAVA tilidir. Uni ishlab chiqishda maxsus o‘rganish talab qilmaydigan, sodda tilni maqsad qilingan. JAVA tili maksimal darajada C ++ tiliga o‘xshash bo‘lishi uchun yaratilgan. JAVA Internet uchun dasturlar tayyorlashning ideal vositasidir. So‘ngi yillarda Microsoft kompaniyasi tomonidan C++ davomchisi sifatida C # (Ci sharp) tili yaratildi. 1985- yilda Bell Labs (AQSh) laboratoriyasi C++ dasturlash tili yaratilganligini xabarini berdi. Bugungi kunda bu til obyektga yo‘naltirilgan dasturlash tillari orasida mashhurdir. Bu til yordamida istalgan mashina uchun – shaxsiydan to superkompyuterlargacha dasturlar yozish mumkin. Bu tilning asoschisi Born Straustrupdir
INKAPSULYATSIYA Obyektga Yo'naltirilgan Dasturlashning tamoyillaridan biri bu inkapsulyatsiya, ya'ni obyektning xususiyatlarga to'g'ridan-to'g'ri (nuqta orqali) murojat qilishni va ularning qiymatini o'zgartirishni taqiqlab qo'yish. Pythonda bunday yopiq xususiyatlarning nomi ikki pastki chiziq bilan boshlanadi: from uuid import uuid4 class Avto: Dasturda ob’ekt komponentasiga quyidagicha murojat kilish mumkin: Sinf-nomi.ob’ekt-nomi :: komponenta-nomi yoki soddarok holda Ob’ekt-nomi. Element-nomi Misol uchun: x.real=1.24; x.imag=0.0; dim[3]. Real=0.25; dim[3]. Imag=0.0; Sinfga tegishli funksiyalarga quyidagicha murojat qilinadi: ob’ekt-nomi. funksiya-nomi Misol uchun: X. define(0.9) (Bu holda real=0.9 va imag=0.0)
X. define(4.3,20.0) (Bu holda kompleks son 4.3+i*20.0) Display funksiyasi ekranda kompleks son qiymatlarini tasvirlaydi. Komponenta o‘zgaruvchilar va komponenta funksiyalar.Sinf kompanenta o‘zgaruvchilari sifatida o‘zgaruvchilar , massivlar, ko‘rsatkichlar ishlatilishi mumkin. Elementlar ta’riflanganda initsializatsiya kilish mumkin emas. Buning sababi shuki sinf uchun xotiradan joy ajratilmaydi. Kompanenta elementlariga kompanenta funksiyalar orkali murojat qilinganda faqat nomlari ishlatiladi Sinfdan tashqarida sinf elementlariga emas ob’ekt elementlariga murojat kilish mumkin . Bu murojat ikki xil bo‘lishi mumkindir. Ob’ekt- nomi . Element - nomi. Sinf elementlari sinfga tegishli funksiyalarida ishlatilishidan oldin ta’riflangan bo‘lishi shart emas. Xuddi shunday bir funksiyadan xali ta’rifi berilmagan ikkinchi funksiyaga murojaat kilish mumkin. Komponentalarga murojaat xukuklari. Komponentalarga murojaat xuquqi murojaat spetsifikatorlari yordamida boshkariladi. Bu spetsifikatorlar: Protected – ximoyalangan; Private – xususiy; Public – umumiy; Ximoyalangan kompanentalardan sinflar ierarxiyasi qurilganda foydalaniladi. Oddiy holda Protected spetsifikatori Private spetsifikatoriga ekvivalentdir. Umumiy ya’ni Public tipidagi komponentalarga dasturning ixtiyoriy joyida murojaat kilinishi mumkin. Xususiy ya’ni Private tipidagi komponentalarga sinf tashqarisidan murojaat qilish mumkin emas. Agar sinflar Struct xizmatchi so‘zi bilan kiritilgan bo‘lsa, uning hamma komponentalari umumiy Public bo‘ladi, lekin bu xuquqni murojaat spetsifikatorlari yordamida o‘zgartirish mumkin.
Agar sinf Class xizmatchi so‘zi orkali ta’riflangan bo‘lsa, uning hamma komponentalari xususiy bo‘ladi. Lekin bu xuquqni murojaat spetsifikatorlari yordamida o‘zgartirish mumkindir. Bu spetsifikator yordamida sinflar umumiy holda quyidagicha ta’riflanadi: class class_name { int data_member; // Ma’lumot-element void show_member(int); // Funksiya-element }; """Avtomobil klassi""" def __init__(self,make,model,rang,yil,narh,km=0): """Avtomobilning xususiyatlari""" self.make = make self.model = model self.rang = rang self.yil = yil self.narh = narh self.__km = km self.__id = uuid4() def get_km(self): return self.__km def get_id(self): return self.__id Yuqoridagi kodimizning 11-qatorida __km xususiyati avtomobilning necha km yurgani haqida ma'lumot saqlaydi va bu ma'lumotni tashqaridan o'zgartirib bo'lmaydi. Kodimizning 12-qatorida esa har bir yangi yaratilgan avtomobilga yangi, noyob va takrorlanmas ID generasiya qilish uchun uuid4() funksiyasidan foydalanayapmiz. Deylik biz mashinalar sotish uchun onlayn bozor yaratsak, bozorimizga qo'shilgan har bir moshina endi o'zining ID raqamiga ega bo'ladi va bu ID raqamni to'g'ridan-to'g'ri (nuqta orqali) ko'rib bo'lmaydi. avto1 = Avto("GM","Malibu","Qora",2020,40000,100000) avto1.__km Natija: AttributeError: 'Avto' object has no attribute '__km' Yopiq xususiyatlarni ko'rish uchun esa alohida metodlar yozish maqsadga muvofiq bo'ladi (get_km() va get_id()): print(f"ID: {avto1.get_id()}") Natija: ID: 1d4f39a4-3222-4682-9231-6275ca5e1bff Bunday yopiq xususiyatlarni o'zgartirish ham metodlar orqali amalga oshirilishi kerak. Misol uchun mashinaning necha km yurganini o'zgartirish uchun klassimizga quyidagi metodni qo'shamiz: def add_km(self,km): """Mashinaning km ga yana km qo'shish""" if km>=0: