logo

inkapsulyasiya metodlari

Yuklangan vaqt:

13.08.2023

Ko'chirishlar soni:

0

Hajmi:

42.20703125 KB
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: 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)
{   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; };
};
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""" 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 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. 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) {
  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; }
"""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. 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 @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: 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.

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: