Sonlar:
In [54]:
x,y=10,20
x+y
Out[54]:
30
In [56]:
x*5
Out[56]:
50
Matnlar:
In [57]:
t1 = "hello"
t2 = "world"
t1+t2
Out[57]:
'helloworld'
In [59]:
t1*5
Out[59]:
'hellohellohellohellohello'
Ro'yxatlar:
In [60]:
l1 = [1, 2, 3]
l2 = [4, 5, 6]
l1+l2
Out[60]:
[1, 2, 3, 4, 5, 6]
In [61]:
l1*2
Out[61]:
[1, 2, 3, 1, 2, 3]
va hokazo.
Keling, bu amallarni bizning obyektimizga ham qo'llab ko'ramiz. Boshlanishiga 2 ta avtosalon yarataylik, va har biriga alohida avtolar qo'shaylik. Ishimizni osonlashtirish uchun add_avto() metodimizni ham istalgancha parametr qabul qilishga moslab o'zgartiramiz:
In [62]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
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
def add_avto(self,*qiymat):
for avto in qiymat:
if isinstance(avto,Avto):
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
Obyektlarni yaratamiz:
In [66]:
# 2 ta avtosalon yaratamiz
salon1 = AvtoSalon("MaxAvto")
salon2 = AvtoSalon("Avto Lider")
In [67]:
# 6 ta avto obyektini yaratamiz
avto1 = Avto("GM","Malibu","Qora",2020,40000)
avto2 = Avto("GM","Lacetti","Oq",2020,20000)
avto3 = Avto("Toyota",'Carolla',"Silver",2018, 45000)
avto4 = Avto("Mazda", "6", 'Qizil',2015,35000)
avto5 = Avto("Volkswagen","Polo",'Qora',2015,30000)
avto6 = Avto("Honda","Accord","Oq",2017,42000)
In [68]:
# Birinchi uchta avtoni birinchi salonga, keyingi uchtasini 2-salonga qo'shamiz.
salon1.add_avto(avto1, avto2, avto3)
salon2.add_avto(avto4, avto5, avto6)
Mavzuga qaytamiz. Operatorlarni qayta talqin qilish. Keling boshlanishiga ikki obyektni qo'shib ko'ramiz:
In [69]:
salon1+salon2
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in ----> 1 salon1+salon2 TypeError: unsupported operand type(s) for +: 'AvtoSalon' and 'AvtoSalon'
Demak, bu ikki obyektni qo'shib bo'lmas ekan. Biz obyekt egasi sifatida qo'shish operatorini o'zimiz istagancha talqin qilishimiz mumkin. Misol uchun AvtoSalon obyektiga boshqa AvtoSalon obyektini qo'shganda, yangi AvtoSalon obyektini qaytaraylik va bu yangi obyekt avvalgi ikki obyektning avtolariga ega bo'lsin.
Qo'shish operatorini qayta talqin qilish uchun AvtoSalon klassimizga __add__ metodini qo'shamiz.
In [70]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
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
def add_avto(self,*qiymat):
for avto in qiymat:
if isinstance(avto,Avto):
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
def __add__(self,qiymat):
if isinstance(qiymat,AvtoSalon):
yangi_salon = AvtoSalon(f"{self.name} {qiymat.name}")
yangi_salon.avtolar = self.avtolar + qiymat.avtolar
return yangi_salon
In [71]:
salon1 = AvtoSalon("MaxAvto")
salon1.add_avto(avto1, avto2, avto3)
salon2 = AvtoSalon("Avto Lider")
salon2.add_avto(avto4, avto5, avto6)
Qo'shish operatorini tekshirib ko'ramiz:
In [72]:
salon3 = salon1+salon2
In [73]:
print(salon3)
MaxAvto Avto Lider avtosaloni
In [74]:
salon3[:]
Out[74]:
[Avto: Qora GM Malibu,
Avto: Oq GM Lacetti,
Avto: Silver Toyota Carolla,
Avto: Qizil Mazda 6,
Avto: Qora Volkswagen Polo,
Avto: Oq Honda Accord]
Istasak, qo'shish operatori yordamida salonga yangi Avto qo'shish imkoniyatini ham yaratishimiz mumkin:
In [75]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
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
def add_avto(self,*qiymat):
for avto in qiymat:
if isinstance(avto,Avto):
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
def __add__(self,qiymat):
if isinstance(qiymat,AvtoSalon):
yangi_salon = AvtoSalon(f"{self.name} {qiymat.name}")
yangi_salon.avtolar = self.avtolar + qiymat.avtolar
return yangi_salon
elif isinstance(qiymat,Avto):
self.add_avto(qiymat)
else:
print(f"AvtoSalon ga {type(qiymat)} qo`shib bo`lmaydi")
Tekshirib ko'ramiz:
In [76]:
salon1 = AvtoSalon("MaxAvto")
salon1.add_avto(avto1, avto2, avto3)
newAvto = Avto("BMW", 'X7','Qora',2015,75000)
salon1 + newAvto
print(salon1[:])
[Avto: Qora GM Malibu, Avto: Oq GM Lacetti, Avto: Silver Toyota Carolla, Avto: Qora BMW X7]
Huddi shu kabi boshqa operatorlarni ham o'zingiz istalgancha talqin qilishingiz mumkin:
OBYEKTNI CHAQIRISH
Obyektlarni huddi funksiyalarni chaqirgandek chaqirish ham mumkin. Odatda biror funksiyaga murojat qilganda funksiya nomidan so'ng qavslar ochiladi va yopiladi. Agar funksiya argument qabul qilsa, ular qavs ichida beriladi.
In [77]:
print(10)
10
In [78]:
len("salom")
Out[78]:
5
Biz obyektimizga ham shunday imkoniyat qo'shishimiz mumkin. Buning uchun maxsus __call__ metodidan foydalaniladi.
PARAMETRSIZ CHAQIRISH
Misol uchun, kelign yuqoridagi AvtoSalon klassiga oid obyektlar chaqirilganda salondagi avtomobillar ro'yxatini ko'rsatadigan qilaylik. Buning uchu AvtoSalon klassiga quyidagi metodni qo'shamiz:
In [79]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
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
def add_avto(self,*qiymat):
for avto in qiymat:
if isinstance(avto,Avto):
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
def __add__(self,qiymat):
if isinstance(qiymat,AvtoSalon):
yangi_salon = AvtoSalon(f"{self.name} {qiymat.name}")
yangi_salon.avtolar = self.avtolar + qiymat.avtolar
return yangi_salon
elif isinstance(qiymat,Avto):
self.add_avto(qiymat)
else:
print(f"AvtoSalon ga {type(qiymat)} qo`shib bo`lmaydi")
def __call__(self):
return [avto for avto in self.avtolar]
In [80]:
salon1 = AvtoSalon("MaxAvto")
salon1.add_avto(avto1, avto2, avto3)
Mana endi obyekt chaqirib ko'ramiz:
In [81]:
salon1()
Out[81]:
[Avto: Qora GM Malibu, Avto: Oq GM Lacetti, Avto: Silver Toyota Carolla]
PARAMETR BILAN CHAQIRISH
Yuqorida salon1 ni parametrsiz chaqrishini ko'rdik. Keling endi parametr bilan chaqirishni ham yo'lga qo'yaylik. Bunda, yuborilgan parametr yangi avto obyekti bo'lsin, va bu parametr salondagi avtolar ro'yxatiga qo'shilsin. Metodimizni quyidagicha o'zgartiramiz:
In [82]:
class AvtoSalon:
"""Avtosalon klassi"""
def __init__(self,name):
self.name = name
self.avtolar = []
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
def add_avto(self,*qiymat):
for avto in qiymat:
if isinstance(avto,Avto):
self.avtolar.append(avto)
else:
print("Avto obyketini kiriting")
def __add__(self,qiymat):
if isinstance(qiymat,AvtoSalon):
yangi_salon = AvtoSalon(f"{self.name} {qiymat.name}")
yangi_salon.avtolar = self.avtolar + qiymat.avtolar
return yangi_salon
elif isinstance(qiymat,Avto):
self.add_avto(qiymat)
else:
print(f"AvtoSalon ga {type(qiymat)} qo`shib bo`lmaydi")
def __call__(self,*param):
if param: # agar parametr bo'lsa
for avto in param:
self.add_avto(avto)
else: # agar parametr bo'lmasa
return [avto for avto in self.avtolar]
Endi bizning klassimizga ham parametr bilan, ham parametrsiz chaqirish imkoniyati qo'shildi.
In [84]:
salon1 = AvtoSalon("MaxAvto")
avto_new = Avto("Mercedes-Benz", 'E200','Silver',2015,80000)
Do'stlaringiz bilan baham: |