manba

Python dasturlash tili: 9.2-dars

Python dasturlash tili: 9.2-dars

9.2 Klass va ob'yekt o'zgaruvchilari

Klass va obyektlarning fuksional qismi, ya'ni metodlarni avvalgi darsda ko'rib o'tdik. Bu darsda klass maydonlari haqida so'z yuritamiz. Klass yoki obyekt maydonlarining oddiy o'zgaruvchilardan farqi ular shu klass yoki obyekt sohasiga tegishli bo'ladi. Ya'ni maydon nomlari shu klass yoki obyekt ichida mavjud bo'ladi. Moydon – o'zgaruvchilarning ikki turi mavjud: Klass o'zgaruvchlari va obyekt o'zgaruvchilari.

Ularning asosiy farqlari quyidagicha:

Klass o'zgaruvchilariga shu klassning barcha obyektlari tomonidan murojaat qilish imkoniyati mavjud. Klass o'zgaruvchisi hamma obyektlar uchun bitta bo'ladi. Shuning uchun biror obyekt klass o'zgaruvchisini o'zgartirsa bu o'zgarish shu klassning qolgan obyektlarida ham ko'rinadi.

Obyekt o'zgaruvchilari esa, klassning har bir ob'yektining o'zigagina tegishli bo'ladi.

Bir obyekt o'zgaruvchisining o'zgartirilishi boshqa obyektlarga ta'sir qilmaydi.

Misol: (objvar.py nomi bilan saqlang)

class Robot:
 
   '''Nomlangan robotlarni ifoda etadi'''
 
   # Klass o'zgaruvchisi robotlar sonini ifoda etadi
   population = 0
 
   def __init__(self, name):
      '''Ma'lumotlar inisializatsiyasi.'''
      self.name = name
 
      print('(Inisializatsiya {0})'.format(self.name))
 
      # Yangi robot xosil qilinayotganda 'population' o'zgaruvchisiga qo'shiladi
      Robot.population += 1
 
 
   def __del__(self):
      '''Robot yo'q qilinyapti.'''
      print("{0} yo'q qilinyapti!".format(self.name))
 
      Robot.population -= 1
 
      if Robot.population == 0:
          print('{0} oxirgisi edi.'.format(self.name))
      else:
          print('{0:d} ta ishchi robotlar qoldi.'.format(Robot.population))
 
 
   def sayHi(self):
      '''Robotlar salomlasha olishadi'''
      print('Salom! Mening nomim {0}.'.format(self.name))
 
 
   def howMany():
      '''Robotlar sonini chop qiladi.'''
      print('Bizda {0:d} ta robot bor.'.format(Robot.population))
 
 
   howMany = staticmethod(howMany)
 
 
droid1 = Robot('R2-D2')
droid1.sayHi()
 
Robot.howMany()
 
droid2 = Robot('C-3PO')
droid2.sayHi()
 
Robot.howMany()
 
print("\nBu yerda robotlar qandaydir ishlarni qilishlari mumkin.\n")
 
print("Robotlar ishlarini qilib bo'ldi. Keling, ularni yo'q qilamiz.\n")
 
del droid1
del droid2
 
Robot.howMany()

Natija:

python objvar.py

(Inisializatsiya R2-D2)

Salom! Mening nomim R2-D2.

Bizda 1 ta robot bor.

(Inisializatsiya C-3PO)

Salom! Mening nomim C-3PO.

Bizda 2 ta robot bor.

Bu yerda robotlar qandaydir ishlarni qilishlari mumkin.

Robotlar ishlarini qilib bo'ldi. Keling, ularni yo'q qilamiz.

R2-D2 yo'q qilinyapti!

1 ta ishchi robotlar qoldi.

C-3PO yo'q qilinyapti!

C-3PO oxirgisi edi.

Bizda 0 ta robot bor.

Bu qanday ishlaydi:

Bu yerda population klass o'zgaruvchisi hisoblanadi. name obyekt o'zgaruvchisi hisoblanadi.

Klass o'zgaruvchisiga self.population tarzida emas, Robot.population tarzida murojaat qilamiz. name obyekt o'zgaruvchisiga esa, self.name tarzida, barcha obyektlar ichida murojaat qilishimiz mumkin.

howMany metodi klassga tegishli, klass obyektiga emas. Bu shuni anglatadiki, biz uni classmethod yoki staticmethod ko'rinishida aniqlashimiz mumkin.

Bunga dekoratorlardan foydalanib ham erishish mumkin:

@staticmethod
 def howMany():
     '''Robotlar sonini chop qiladi.'''
          print('Bizda {0:d} ta robot bor.'.format(Robot.population))

__init__ metodida har bir hosil qilingan robot uchun population klass o'zgaruvchisini birga oshiryapmiz. self.name esa har bir obyektning o'zigagina tegishli.

__init__ metodi bilan bir qatorda __del__ metodi ham mavjud bo'lib, bu metod qachonki obyekt o'chirilayotganda chaqiriladi va uning xotirada egallagan joyi operasion tizimga keyingi ishlatishlar uchun qaytariladi. Bu metodda biz Robot.population klass o'zgaruvchisini birga kamaytiramiz.

Meros olish

Obyektga yo'naltirilgan dasturlashning ya'na bir katta afzalligi biror kod bo'lagini bir necha marta qayta ishlatish imkoniyatidir. Bu imkoniyatga meros olish mexanizmi bilan erishish mumkin.

Aytaylik, biz kollejdagi o'qituvchilar va talabalar haqidagi ma'lumotlarni o'zida jamlovchi dastur tuzmoqchimiz. Ularning bir nechta umumiy xususiyatlari bor: ismi, yoshi va manzili. Va ya'na aloxida xususiyatlari ham mavjud: o'qituvchilar uchun maosh, dars kurslari, ta'til, talabalar uchun baxo va o'qish uchun to'lov.

O'qituvchilar va talabalar uchun alohida-alohida klass tuzish mumkin, lekin ular uchun umumiy bo'lgan biror xususiyat qo'shishga to'g'ri keladigan bo'lsa, u holda har bir klass uchun bu xususiyatni qo'shib chiqish kerak bo'ladi.

Eng yaxshisi SchoolMember degan umumiy klass qilish kerakda va shu klassdan o'qituvchilar va talabalar klasslari meros olsin. Shunda o'qituvchi va talabalar uchun umumiy bo'lgan xususiyatlarni SchoolMember asos klassga qo'shish mumkin bo'ladi.

Bu usulning bir nechta afzalliklari bor. Agar biz SchoolMember klassida biror metodni yoki xususiyatni o'zgartirsak yoki qo'shsak bu o'zgarishlar avtomatik o'qituvchilar va talabalar klasslarida (SchoolMember ning bola klasslarida) o'z aksini topadi. Misol uchun, biz o'qituvchilar va talabalar hujjatlari uchun yangi xususiyatni SchoolMember asos klassga qo'shishimiz mumkin.

Misol: (inherit.py nomi bilan saqlang)

class SchoolMember:
   '''Maktabdagi ixtiyoriy shaxsni ifoda etadi.'''
 
   def __init__(self, name, age):
      self.name = name
      self.age = age
 
      print('(SchoolMember hosil qilindi: {0})'.format(self.name)) 
 
   def tell(self):
      '''Ma'lumotni chop qilish.'''
      print('Ismi:"{0}" Yoshi:"{1}"'.format(self.name, self.age), end=" ") 
 
class Teacher(SchoolMember):
   '''O'qituvchilarni ifoda etadi.'''
 
   def __init__(self, name, age, salary):
      SchoolMember.__init__(self, name, age)
      self.salary = salary
 
      print('(Teacher hosil qilindi: {0})'.format(self.name)) 
 
   def tell(self):
      SchoolMember.tell(self)
      print('Maoshi: "{0:d}"'.format(self.salary)) 
 
class Student(SchoolMember):
   '''Talabalarni ifoda etadi.'''
 
   def __init__(self, name, age, marks):
      SchoolMember.__init__(self, name, age)
      self.marks = marks
 
      print('(Student hosil qilindi: {0})'.format(self.name)) 
 
   def tell(self):
      SchoolMember.tell(self)
      print('Bahosi: "{0:d}"'.format(self.marks)) 
 
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 25, 75)
 
print() # Bo'sh qator chop qiladi
 
members = [t, s]
 
for member in members:
   member.tell() # O'qituvchi uchun ham talaba uchun ham ishlaydi

Natija:

$ python3 inherit.py

(SchoolMember hosil qilindi: Mrs. Shrividya)

(Teacher hosil qilindi: Mrs. Shrividya)

(SchoolMember hosil qilindi: Swaroop)

(Student hosil qilindi: Swaroop)

Ismi:"Mrs. Shrividya" Yoshi:"40″ Maoshi: "30000"

Ismi:"Swaroop" Yoshi:"25″ Baxosi: "75"

Bu qanday ishlaydi:

Meros olish imkoniyatidan foydalanish uchun klassni e'lon qilish joyida shu klass nomidan keyinoq kortejda asos klass nomini ko'rsatamiz. Asos klassning __init__ metodida obyekt qismining asos klassga tegishli bo'lgan xusisiyatlarni inisializatsiya qilamiz. Buni eslab qolish juda muhim: Python asos klassning __init__ metodini avtomat tarzda chaqirmaydi, uni ochiq oydin qilib chaqirish kerak bo'ladi.

Manba:


JONNY - Texnoman foydalanuvchisi

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript. O'zbekistonni rivojlantiramiz! Dasturlash orqali vatanimizni yangi marralarga olib chiqamiz.


Qiziq bo‘ladi:


Birinchi bo‘ling!

Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!