# Avto obyektlarini yaratamiz
avto1 = Avto("GM","Malibu","Qora",2020,40000)
avto2 = Avto("GM","Lacetti","Oq",2020,20000)
avto3 = Avto("Toyota",'Carolla',"Silver",2018, 45000)
# Yuqoridagi obyektlarni salon1 ga qo'shamiz
for avto in [avto1, avto2, avto3]:
salon1.add_avto(avto)
Mana navbat __len__ metodiga. Biz bu metod yordamida len() funksiyasi salonimizdagi avtomobillar sonini qaytaradigan qilamiz. Buning uchun yuqoridagi AvtoSalon klassiga __len__ funksiyani ham qo'shamiz va uni obyekt ichidagi avtolar ro'yxatyining uzunligini qaytaradigan qilamiz:
In [30]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
def __repr__(self):
return f"{self.name} avtosaloni"
def add_avto(self,avto):
if isinstance(avto,Avto): # agar avto Avto klassidan bo'lsa
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
def __len__(self):
return len(self.avtolar)
In [32]:
salon1 = AvtoSalon("MaxAvto")
# Avto obyektlarini yaratamiz
avto1 = Avto("GM","Malibu","Qora",2020,40000)
avto2 = Avto("GM","Lacetti","Oq",2020,20000)
avto3 = Avto("Toyota",'Carolla',"Silver",2018, 45000)
# Yuqoridagi obyektlarni salon1 ga qo'shamiz
for avto in [avto1, avto2, avto3]:
salon1.add_avto(avto)
Mana endi bizning AvtoSalon klassimizga oid obyektlar uchun ham len() funksiyasini qo'llasak bo'ladi:
In [33]:
print(len(salon1))
3
OBYEKT ELEMENTLARIGA MUROJAT QILISH
Ba'zi obyektlarning (matn, ro'yxat, lug'at va hokazo) elementlariga alohida murojat qilish mumkin.
In [35]:
mevalar = ['olma','anor','uzum']
mevalar[0]
Out[35]:
'olma'
Bizning salonimizda ham 3 ta avto bor, ularni ko'rish uchun yuqoridagi kabi element raqami orqali murojat qila olamizmi?
In [36]:
salon1[0]
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in ----> 1 salon1[0] TypeError: 'AvtoSalon' object is not subscriptable
Afsuski yo'q. Ko'rib turganingizdek bizning obyektimizga bunday murojat qilib bo'lmas ekan. Obyektimizga bu xususiyatni qo'shish uchun __getitem__ metodini yozishimiz kerak.
In [39]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
def add_avto(self,avto):
if isinstance(avto,Avto): # agar avto Avto klassidan bo'lsa
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
def __repr__(self):
return f"{self.name} avtosaloni"
def __len__(self):
return len(self.avtolar)
def __getitem__(self,index):
return self.avtolar[index]
Endi salon1 obyektimizning elementlariga murojat qilinganda __getitem__ metodi obyekt ichidagi avtolar ro'yxatidan ko'rsatilgan element (avtomobilni) qaytaradi.
In [42]:
%%capture
salon1 = AvtoSalon("MaxAvto")
# Avto obyektlarini yaratamiz
avto1 = Avto("GM","Malibu","Qora",2020,40000)
avto2 = Avto("GM","Lacetti","Oq",2020,20000)
avto3 = Avto("Toyota",'Carolla',"Silver",2018, 45000)
# Yuqoridagi obyektlarni salon1 ga qo'shamiz
[salon1.add_avto(avto) for avto in [avto1, avto2, avto3]]
In [41]:
len(salon1)
Out[41]:
3
In [43]:
salon1[0]
Out[43]:
Avto: Qora GM Malibu
In [45]:
salon1[1]
Out[45]:
Avto: Oq GM Lacetti
In [46]:
salon1[2]
Out[46]:
Avto: Silver Toyota Carolla
In [47]:
salon1[:]
Out[47]:
[Avto: Qora GM Malibu, Avto: Oq GM Lacetti, Avto: Silver Toyota Carolla]
Keling obyekt elementlaridan birini o'zgartirib ko'ramiz:
In [48]:
avto4 = Avto("Mazda", "6", 'Qizil',2015,35000)
salon1[0]=avto4
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in 1 avto4 = Avto("Mazda", "6", 'Qizil',2015,35000) ----> 2 salon1[0]=avto4 TypeError: 'AvtoSalon' object does not support item assignment
Yana xatolik. Gap shundaki __getitem__ metodi o'z nomi bilan (get) element qaytaruvchi metod. Biror elementni o'zgartirish uchun esa __setitem__ metodini ham qo'shishimiz kerak. Bu metodimizga murojat qilinganda ham, yangi qiymat Avto klassiga oid ekanligini tekshirib olish maqsadga muvofiq bo'ladi:
In [49]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
def add_avto(self,avto):
if isinstance(avto,Avto): # agar avto Avto klassidan bo'lsa
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
def __repr__(self):
return f"{self.name} avtosaloni"
def __len__(self):
return len(self.avtolar)
def __getitem__(self,index):
return self.avtolar[index]
def __setitem__(self,index,value):
if isinstance(value,Avto):
self.avtolar[index]=value
In [51]:
%%capture
salon1 = AvtoSalon("MaxAvto")
# Avto obyektlarini yaratamiz
avto1 = Avto("GM","Malibu","Qora",2020,40000)
avto2 = Avto("GM","Lacetti","Oq",2020,20000)
avto3 = Avto("Toyota",'Carolla',"Silver",2018, 45000)
# Yuqoridagi obyektlarni salon1 ga qo'shamiz
[salon1.add_avto(avto) for avto in [avto1, avto2, avto3]]
Qaytadan elementni o'zgartirishga harakat qilib ko'ramiz:
In [52]:
avto4 = Avto("Mazda", "6", 'Qizil',2015,35000)
salon1[0]=avto4
print(salon1[0])
Avto: Qizil Mazda 6
Kutilgan natija chiqdi.
OPERATORLARNI QAYTA TALQIN QILISH (OVERLOADING)
Pythonda obyektlar o'rtasida turli arifmetik amallarni bajarish mumkin va bu amallar obyektning turiga qarab, Pytnon tomonidan turlicha talqin qilinadi. Masalan:
Do'stlaringiz bilan baham: |