#31 INKAPSULYATSIA, KLASSNING XUSUSIYAT VA METODLARI
Inkapsulyatsiya yordamida obyektning xususiyatlarini yashirish.
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:
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.
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()
):
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:
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:
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 berdikKeyingi qatorlarda
__init__
metodi yordamida klassdan yaratiladigan obyektlarning xususiyatlarini e'lon qildik va har gal bu metdoga murojat qilingandannum_avto
ning qiymatini1
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:
Natija: 2
Natija: 3
KLASSNING XUSUSIYATLARINI INKAPSULYATSIYA QILISH
Klassga oid xususiyatlar ham huddi yuoqridagi kabi nomidan avval ikki pastki chiziq qo'shish bilan inkapsulyatsiya qilinadi:
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.
Klass metodlarga klassning nomi orqali murojat qilinadi:
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:
BIR NECHTA KLASSLARNI IMPORT QILISH
Moduldan bir nechta klass chaqirish talab qilinsa, import
so'zidan so'ng klasslar ketma-ket vergul bilan ajratib yoziladi:
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:
MODULDAGI BARCHA KLASSLARNI IMPORT QILISH
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.
Bu usul 2 sababga ko'ra tavsiya qilinmaydi:
Dasturni kelajakda qayta ochganimizda, dastur davomida moduldagi aynan qaysi klasslardan foydalanganimizni bir qarashda bilib bo'lmaydi
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.
Modul ichiga boshqa modulni ham import qilish mumkin. Masalan modul ichidagi ba'zi klasslar to'g'ri ishlashi uchun boshqa modul talab qilingan vaqtlarda.
AMALIYOT
Avvalgi darslarimizda yaratgan
Shaxs
vaTalaba
klasslariga yopiq xususiyatlar qo'shing va ularning qiymatini ko'rsatuvchi va o'zgartiruvchi metodlar yozing.Yuqoridagi klasslarga
talabalar_soni
vaodamlar_soni
degan klassga oid xususiyatlar qo'shing.Klassga oid xususiyatlar bilan ishlash uchun maxsus
@classmethod
lar yozing
Last updated