.1. Sinflarni tavsiflash va ularning nusxalarini yaratish
Yangi sinflarni class xizmatchi soʻzi yordamida e’lon qilish mumkin. Buyruqning umumiy koʻrinishi quyidagicha:
class [(<1_sinf>[, ..., ]) ] :
[""" hujjatlashtirish satri """]
Bu koʻrsatma yangi obyektni yaratadi va uni identifikatoriga havola oʻrnatadi. Demak, Python tilida oʻzgaruvchilarning nomlariga qoʻyiladigan barcha qoidalarga mos kelishi kerak. Sinf nomidan keyin oddiy qavslar orasida bir yoki bir nachta bazaviy sinflarni koʻrsatish mumkin. Agar yaratilayotgan yangi sinf uchun bazaviy sinf mavjud boʻlmasa (ya’ni ulardan hech qanday ma’lumotlarni “meros qilib olmasa”, bu qavslar yozilmaydi.
Quyigi kod yordamida namuna uchun ekranga shunchaki matnli axborot uzatuvchi sodda sinf ishlab chiqilmoqda:
class Namuna:
""" bu hujjatlashtirish satri """
print("Bu yerda yangi sinf yaratildi")
input()
Bu namunada Namuna nomli yangi sinfni tavsiflangan. Bu sinfga murojaat boʻlgan zahoti print() da koʻrsatilgan matn ekranga uzatiladi.
Sinf hususiyatlarini e’lon qilish huddi oddiy oʻzgaruvchilar kabi amalga oshiriladi. Shuningdek, metodlar han sinf ichida funksiyalar bilan bir hil usulda, ya’ni def yordamida tashkil qilinadi. Birinchi parametrda oshkor koʻrsatilgan sinf metodlariga murojaat qilinganda, havolalar toʻgʻridan-toʻgʻri sinf nusxasiga uzatiladi. Odatda bu parametrni majburiy boʻlmasada, self nomi bilan atash qabul qilingan. Yangi ainqlanayotgan metodlar ichida sinf hususiyat va metodlari bilan ishlash uchun ruhsat ana shu self oʻzgaruvchisi orqali nuqta yordamida beriladi. Masalan, x hususiyatga self.x shaklida murojaat qilish mumkin.
Qurilgan yangi sinf hususiyat va metodlari bilan ishlash imkoniyatiga ega boʻlish uchun uning nusxasini yaratish talab qilinadi. Bu koʻrsatmaning umumiy koʻrinishi quyidagicha:
= ([
]).
Sinf metodlariga murojaat qilsh uchun quyidagicha koʻrsatmadan foydalanish mumkin:
.([
]).
Shuni aytish joizki, metodga murojaat qilganda parameter sifatida sinf nusxasiga havolani uzatish shart emas. Bunday holatni sinfni tavsiflash jarayonida ichki metodlarni aniqlashda kuzatish mumkin. Sinf nusxasiga havolani interpretator toʻgʻridan-toʻgʻri uzatadi.
Sinf hususiyatlariga muojaatlat ham huddi shu zaylda amalga oshiriladi.
..
Quyidagi kodda dastlab x hususiyatli va metodi printx() boʻlgan Namuna sinfi aniqlanadi, soʻngra uning husxasi yaratiladi va metodga murojaat qilinadi.
class Namuna:
def _init_(self): # Konstruktor
self.x =10 # sinf nusxasining hususiyati
def print_x(self): # self – bu sinf nusxasiga havola
print(self.x) # hususiyat qiymatini chiqaramiz
с = Namuna() # sinf nusxasi yaratilmoqda
# print_x() metodiga murojaat qilamiz
c.print_x() # metodga murojaat qilganda self koʻrsatilmoqda
print(с.х) # hususiyatga bevosita murojaat qilish mumkin
Sinf hususiyat va metodlari bilan ishlash uchun quyidagi funksiyalardan foydalanish mumkin:
♦ getattr () — satr koʻrinishida berilgan hususiyat nomi boʻyicha uning qiymatini qaytaradi. Bu funksiya yordamida dasturning bajarilishi jarayonida hususiyat nomini dinamik shakllantirish mumkin. Funksiyaning umumiy koʻrinishi quyidagicha:
getattr (, [, [ toʻgʻridan-toʻgʻri qiymat>])
Agar koʻrsatilgan hususiyat mavjud boʻlmasa, AttributeError istisnoli vaziyati yuzaga keladi. Ekranga hatolik haqidagi axborotning chiqarilmasligi uchun uchunchi parametr sifatida parametr mavjud boʻlmaganda uzatilishi lozim boʻlgan qiymat koʻrsatiladi.
♦ setattr () — hususiyat qiymatini qaytaradi. Hususiyat nomi satr shaklida uzatiladi. Funksiyaning umumiy koʻrinishi quyidagicha:
setattr(, , ).
Agar funksiyaning ikkinchi parametr sifatida mavjud boʻlmagan hususiyat nomini uzatilgan boʻlsa, u holda koʻrsatilgan nomdagi hususiyat yaratiladi;
♦ delattr (, ) — satr shaklida uzatilgan hususiyat oʻchiriladi;
hasattr (, ) — koʻrsatilgan hususiyatning mavjudligini tekshiradi va u mavjud boʻlsa, True ni qaytaradi. Quyidagi namunaga e’tibor bering:
class Namuna:
def __init__(self) :
self.x = 10
def get_x(self):
return self.x
c = Namuna() # sinf nusxasi yaratilmoqda
print(getattr(c, "x")) # Chiqaradi: 10
print(getattr(c, "get_x")()) # Chiqaradi: 10
print(getattr(c, "y", 0)) # Chiqaradi: 0, chunki hususiyat topilmagan
setattr(c, "y", 20) # yangi y hususiyat yaratilmoqda
print(getattr(c, "y", 0)) # Chiqaradi: 20
delattr(c,"y") # у hususiyat oʻchirirlmoqda
print(getattr(c, "у", 0)) # Chiqaradi: 0, chunki hususiyat topilmagan
print(hasattr(c, "х")) # Chiqaradi: True
print(hasattr(c, "у")) # Chiqaradi: False
Python tilida barcha hususiyatlar ochiq (public) hisoblanadi, ya’ni sinfning oʻzidan, boshqa sinflardan yoki bevosita asosiy kodda tahrirlash mumkin.
Bundan tashqari, hususiyatlarni sinf yaratilganidan soʻng dinamik hosil qilish mumkin. Bunda u sinf obyektining hususiyati yoki sinf nusxasining hususiyati sifatida yaratiladi. Quyidagi namunaga e’tibor bering:
class Namuna: # Boʻsh sinf yaratilmoqda
pass
Namuna.x = 50 # sinf obyekti hususiyati aniqlanmoqda
c1, c2 = Namuna(), Namuna() # sinfning ikkita nusxasi yaratilmoqda
c1.y = 10 # sinf husisiyati aniqlanmoqda
c2.y = 20 # sinf husisiyati aniqlanmoqda
print( c1.x , c1.y) # Chiqaradi: 50 10
print (c2.x, c2.y) # Chiqaradi: 50 20
Bu misolda dastlab pass yordamida boʻsh sinf yaratildi. Soʻngra uning x hususiyati aniqlandi. Bu hususiyat sinfnig yaratiladigan barcha hususiyatlari uchun ochiq. Shundan keyin Namuna sinfining ikkita nusxasi yaratildi va y hususiyat qoʻshildi. Bu hususiyatning qiymati har ikki nusxa uchun har xil. Agar sinfning yangi nusxasi yaratilsa, unda hozircha y hususiyati mavjud boʻlmaydi.
Sinf obyekti va sinf nusxasi hususiyatlari oʻrtasidagi farqni yodda tutish muhim. Sinf obyektining hususiyatlari sinfning barcha nusxalari uchun oshiq va bitta nusxada ulardan birining oʻzgartirilishi boshqa nusxalarda ham oʻzgarishlarga olib keladi. Sinfning bitta nusxasidagi oʻzgarishlar esa shu sinfning boshqa nusxalariga ta’sir koʻrsatmaydi. Quyidagi namunada sinf obyekti x va nusxasining hususiyati y boʻlgan sinf yaratilgan.
class Namuna:
x = 10 # sinf obyektining hususiyati
def __init__(self) :
self. y = 20 # sinf nusxasining hususiyati
Endi shu sinfning ikkita nusxasini yaratiladi:
c1 = Namuna() # sinf nusxasi yaratilmoqda
c2 = Namiuna() # sinf nusxasi yaratilmoqda.
Dastlab x hususiyat qiymatini chiqargandan soʻng uning qiymati oʻzgartiriladi va yana chiqariladi:
print (c1.x, c2.x) # Chiqaradi: 10 10
Namuna.x = 88 # sinf nusxasining hususiyati oʻzgartirilmoqda
print (c1.x, c2.x) # Chiqaradi: 88 88
Misoldan koʻrinib turibdiki, obyekt hususiyati oʻzgarishini har ikki husxada ham kuzatish mumkin. Endi huddi shu amalni y hususiyat uchun takrorlaylamoqda:
print (c1.y, c2.y) # Chiqaradi: 20 20
c1.y= 88 # sinf nusxasining hususiyati oʻzgartirilmoqda
print (c1.y, c2.y) # Chiqaradi: 88 20
Bu holda oʻzgarishlar faqat c1 nusxadagi hususiyatga tegishli boʻldi holos.
Shuni yodda tutish kerakki, bitta sinfda bir vaqtning oʻzida bir hil nomdagi obyekt va nusxa hususiyatlari mavjud boʻlishi mumkin. Obyekt hususiyati quyidagicha almashtirilgan:
Namuna.x = 88 # sinf nusxasining hususiyati oʻzgartirilmoqda
Agar shundan keyin
c1.x = 200 # nusxa hususiyati yaratilmoqda
koʻrsatmasi yozilgan boʻlsa, u holda sinf nusxasi hususiyati yaratiladi, obyekt hususiyatining qiymati esa oʻzgarmaydi. Bunga ishonch qilish mumkin:
print (cl.x, Namuna.x) # 200 88
Do'stlaringiz bilan baham: |