#29 OBYKETLAR BILAN ISHLASH
Obyektlar bilan ishlashni o'rganamiz.
XUSUSIYATLARGA STANDART QIYMAT BERISH
Avvalgi darsizmida biz klass yaratish, unga xususiyatlar va metodlar qo'shishni ko'rdik. Klassdan obyekt yaratganimizda esa uning xususiyatlarini parametr sifatida uzatishni o'rgandik.
Pythonda obyektning ba'zi xususiyatlarini parametr yordamida uzatmasdan, klass yaratishda unga standart qiymat berib ketishimiz mumkin. Keling, Talaba
klassimizga qaytamiz. Bu klassimiz 3 ta xususiyatga ega edi: ism
, familiya
, tyil
. Biz yana bitta qo'shimcha, bosqich
nomli xususiyat qo'shamiz, va unga standart qiymat sifatida 1
beramiz, e'tibor qiling bu xususiyat obyekt yaratilishida parametr sifatida uzatilmaydi:
Endi, Talaba
klassidan yangi obyekt yaratganimizda har bir yangi talabaning kursi 1
ga teng bo'ladi.
Natija: Alijon Valiyev. 1-bosqich talabasi
STANDART QIYMATNI O'ZGARTIRISH
Obyektning standart qiymatiga ham boshqa xususiyatlar kabi nuqta orqali murojat qilishimiz va uning qiymatini almashtirishimiz mumkin:
Natija: 2
Yana boshqa usuli, obyekt xususiyatini yangilovchi metod yozish.
Metodga murojat qilamiz:
Natija: Alijon Valiyev. 3-bosqich talabasi
Umuman olganda xususiyatlarni yangilashda turli usullardan foydalanish mumkin. Misol uchun talabaning bosqichi odatda 1 tadan ko'payib boradi, shuning uchun quyidagicha metod ham yozishimiz mumkin:
update_bosqich()
metodiga murojat qilganimizda talabning bosqichi oshib boradi:
Natija: Alijon Valiyev. 1-bosqich talabasi
Natija: Alijon Valiyev. 2-bosqich talabasi
Natija: Alijon Valiyev. 3-bosqich talabasi
OBYEKTLAR O'RTASIDA MUNOSABAT
Obyektga yo'naltirilgan dasturlashning afzalligi, turli obyektlar o'rtasida o'zaro munosabatlarni oson yo'lga qo'yish mumkinligida. Buni misolda ko'rish uchun, yangi Fan
degan klass yaratamiz va fanimizga talabalar qo'shish imkoniyatini ham yaratamiz (add_student()
metodi):
E'tibor bering, Fan
klassi faqatgina yagona nomi
degan parametrga ega. Qolgan xususiyatlariga esa standart qiymat berilgan: talabalar soni (self.talabalar_soni
) 0 ga teng, talabalar ro'yxati (self.talabalar
) esa bo'sh.
Fanimizga talaba qo'shish uchun add_student()
metodini chaqiramiz. Bu metod parametr sifatida Talaba
obyektini qabul qiladi va uni talabalar
ro'yxatiga qo'shadi. Shuningdek, bu metod yangi talaba qo'shilganda talabalar_soni
ni 1 taga oshirib qo'yadi.
Keling boshlanishiga yangi fan obyektini va bir nechta talabalarni yaratamiz:
Talabalarni yangi fanimizga qo'shamiz:
Mana, fanimiz tayyor, talabalar qo'shildi. Keling endi fan haqida ma'lumotlarni olamiz:
Natija: 3
Fanimizga 3 ta talaba qo'shilibdi. Talabalar haqida ma'lumot olsak bo'ladimi?
Natija: [<__main__.Talaba object at 0x000001AB08939588>, <__main__.Talaba object at 0x000001AB089397C8>, <__main__.Talaba object at 0x000001AB087D9F08>]
Talabalarning ismi familiyasi o'rniga qandaydur tushunarsiz ma'lumotlar. Aslida hammasi to'g'ri, yuqorida fanimizga yangi talabalarni obyekt sifatida qo'shgan edik, yuqoridagi natija esa matematika.talabalar ro'yxatida Talaba
klassiga oid 3 ta obyekt borligini ko'rsatayapti.
Fanimizga yozilgan talabalar haqida tushunarli ma'lumot olish uchun esa Fan klassiga yana bir, get_students()
degan, yangi metod qo'shamiz. Bu metod talabalar
ichidagi har bir talaba
obyektiga murojat qilib, get_info()
metodi yordamida talabaning ma'lumotlarini oladi, ro'yxatga qo'shadi va shu ro'yxatni qaytaradi:
Shu o'rinda Pythonda ro'yxatlar bilan ishlashning qulayliklaridan birini ham ko'rsatib o'tsak. Yuqoridagi kodimizning 13-qatorida e'tibor bersangiz, biz yangi ro'yxat shakllantirishda 1 qator koddan foydalandik:
Kodimizni tahlil qilsak, self.talabalar
ichidagi har bir talaba uchun get_info()
metodini bajar degan ma'no kelib chiqadi. Kodni kvadrat qavslar ichiga olganimiz uchun esa, har bir tsikl natijasi avtomat ravishda ro'yxatga qo'shib boriladi.
Mana endi metodga murojat qilib, talabalar haqida ma'lumot olishimiz mumkin:
['Alijon Valiyev. 1-bosqich talabasi ', 'Hasan Alimov. 1-bosqich talabasi ', 'Akrom Boriyev. 1-bosqich talabasi ']
Shunday qilib biz ikki bir-biriga bog'liq bo'lmagan obyektlar ustida turli munosabatlar o'rnatishimiz mumkin.
NUQTA YOKI METOD?
Pythondagi obyketlarning o'ziga xos xususiyatlaridan biri, obyektning xususiyatiga nuqta orqali murojat qilish mumkin. Misol uchun avval yaratagn talaba1
obyektining ismini bilish uchun talaba1.ism
deb yozish kifoya.
Bu o'ziga yarasha qulay bo'lsada, bu usuldan foydalanmagan afzal. Sababi, vaqt o'tib klassingiz takomillashishi, uning ba'zi xususiyatlari o'zgarishi, o'chirilishi yoki almashtirilishi mumkin. Shunday holatlarda nuqta orqali murojat qilish siz kutgan natijani bermasligi va dastur xato ishlashiga olib kelishi mumkin. Bunday holatlarning oldini olish uchun esa, obyektning xususiyatlarini metod orqali olishni odat qilish tavsiya qilinadi. Huddi shu kabi, obyektning xususiyatlarini yangilash uchun ham alohida metodlar yozga afzal.
Dasturchilar orasida obyektning xususiyatlarini o'zgartiradigan metodlarni set
(o'zgartir) so'zi bilan, xususiyatlarni qaytaradigan metodlarni esa get
(olish) so'zi bilan boshlash qoida qilib olingan. Masalan: set_name()
va get_name()
kabi.
Agar yuqoridagi qoidalarga amal qilgan holda, Talaba
klassimizni yangilaydigan bo'lsak, u tahminan shunday ko'rinishga ega bo'ladi:
Huddi shu kabi, Fan
klassimizning yakuniy ko'rinishi quyidagicha bo'ladi:
OBYEKTNING XUSUSIYATLARI VA METODLARINI KO'RISH
Obyektlar bilan ishlaganda, o'z-o'zidan shu obyektga tegishli xususiyatlar va metodlarni bilish talab qilinadi. Agar obyekt tegishli bo'lgan klassni o'zimiz yaratgan bo'lsak, istalgan payt klass ichini ko'rib olishimiz mumkin. Lekin boshqalar yaratgan klass haqida ma'lumot olish talab qilinsa, buning bir nechta yo'li bor.
dir()
FUNKSIYASI
dir()
FUNKSIYASIdir()
funksiyasi yordamida istalgan obyekt yoki klassning xususiyatlari va metodlarini ko'rib olishimiz mumkin:
Lekin bunda har bir klass bilan keluvchi maxsus dunder metodlar ham chiqib keldi. Dunder metodlar ikki pastki chiziq (__
) bilan boshlanadi va maxsus holatlar uchun saqlab qo'yilgan. Biz hozircha faqat __init__
metodi bilan tanishdik, qolganlari bilan keyingi darslarimizda yana ko'rishamiz. Dunder metodlardan keyin esa biz murojat qilishimiz mumkin bo'lgan metodlar ro'yxati kelgan.
Dunder — double underscore (ikki pastki chiziq) so'zlarining qisqartmasi.
Keling dunder metodlarni tashlab, bizga kerak metodlarni qaytaruvchi sodda funksiya yozamiz:
Natija: ['get_age', 'get_fullname', 'get_info', 'get_lastname', 'get_name', 'set_bosqich', 'update_bosqich']
Agar dir()
funksiyasiga klass emas, obyekt uzatsak metodlardan tashqari xususiyatlar ham chiqib keladi:
Natija: ['bosqich', 'familiya', 'get_age', 'get_fullname', 'get_info', 'get_lastname', 'get_name', 'ism', 'set_bosqich', 'tyil', 'update_bosqich']
__dict__
METODI
__dict__
METODIYuqorida zikr qilingan dunder metodlardan biri bu __dict__
metodi bo'lib, bu metod obyketning xususiyatlarini lug'at ko'rinishida qaytaradi:
Natija: {'ism': 'Alijon', 'familiya': 'Valiyev', 'tyil': 2000, 'bosqich': 1}
Natijadan faqatgina kalitlarni ajratib olsak, obyektning xususiyatlari chiqadi:
Natija: dict_keys(['ism', 'familiya', 'tyil', 'bosqich'])
AMALIYOT
Avto
degan yangi klass yarating. Unga avtomobillarga doir bo'lgan bir nechta xususiyatlar (model, rang, korobka, narh va hokazo) qo'shing. Ayrim xususiyatlarga standart qiymat bering (masalan,kilometer=0
)Avto
ga oid obyektning xususiyatlarini qaytaradigan metodlar yozingget_info()
metodi avti haqida to'liq ma'lumotni matn ko'rinishida qaytarsin
Avto
ga oid obyektning xususiyatlarini yangilaydigan metodlar yozing.update_km()
metodi son qabul qilib olib, avtomobilning yurgan kilometrajini yangilab borsin
Yangi,
Avtosalon
degan klass yarating va kerakli xususiyatlar bilan to'ldiring (salon nomi, manzili, sotuvdagi avtomobillar va hokazo)Avtosalonga yangi avtomobillar qo'shish uchun metod yozing
Avtosalondagi avtomobillar haqida ma'lumot qaytaruvchi metod yozing
Yuqoridagi obyektlar va ularga tegishli metodlarni tekshirib ko'ring
dir()
funksyasi va__dict__
metodi yordamida o'zingiz yozgan va Pythondagi turli klass va obyektlarning xususiyatlari va metodlarini toping (dir(str)
,dir(int)
va hokazo)
KODLAR
Last updated