__hash__(self) — bu metoddan agar sinf nusxasi rejalanuvchan boʻlsa, sqayta aniqlash va lugʻat kaliti saifatida yoki toʻplam ichida foydalanish mumkin:
class Namuna:
def __init__(self, у):
self .x= у
def __hash__(self) :
return hash(self.x)
c = Namuna(10)
d = {}
d[c] = "Qiymat"
print(d[c]) # chiqradi: Qiymat
13.6. Operatorlarni qayta yuklash Operatorlarni qayta yuklash sinf nusxalariga odatiy amallarni bajarishda ishtirok etishga imkon beradi. Operatorni qayta yuklash uchun sonfda metodni maxsus nom bilan aniqlash talab qilinadi.
Matematik operatorlarni qayta yuklash quyidagi metodlar yordamida amalga oshiriladi:
amal
ma’nosi
yozilishi
х + у
qoʻshish
х.__add__ (у)
у + х
qoʻshish (sinf nusxasi oʻng tomonda)
х.__radd__(у)
х += у
qoʻshish va qiymat berish
х.__iadd__(у)
х - у
ayirish
х.__sub__(у)
у - х
ayirish (sinf nusxasi oʻng tomonda)
х.__rsub__(у)
х -= у
ayirish va qiymat berish
х.__isub__(у)
х * у
koʻpaytirish
х._mul_(у)
у * х
koʻpaytirish (sinf nusxasi oʻng tomonda)
х._rmul__(у)
х *= у
koʻpaytirish va qiymat berish
х.__imul__(у)
х/у
boʻlish
х.__truediv__(у)
у / х
(sinf nusxasi oʻng tomonda)
х._rtruediv_(у)
х /= у
boʻlish va qiymat berish
x._itruediv_(y)
х // у
quyidan yahlitlab boʻlish
х.__floordiv__(у)
y // х
quyidan yahlitlab boʻlish (sinf nusxasi oʻng tomonda)
x._rfloordiv_(y)
х //= у
quyidan yahlitlab boʻlish va qiymat berish
x._ifloordiv_(y)
х % у
boʻlish qoldigʻi
х ._mod__(у)
у % х
boʻlish qoldigʻi (sinf nusxasi oʻng tomonda)
х ._rmod_ (у)
х %= у
boʻlish qoldigʻi va qiymat berish
х.__imod__(у)
х ** у
darajaga koʻtarish
х._pow__(у)
у ** х
darajaga koʻtarish (sinf nusxasi oʻng tomonda)
х.__rpow__(у)
х**= у
darajaga koʻtarish va qiymat berish
х.__ipow__(у)
-х
unar minus
х.__neg__()
+х
unar plyus
х.__pos__()
abs (x)
absolyut qiymat
х._abs_()
Quyidagi kodda matematik operatorlarni qayta yuklash uchun namuna keltirilgan.
class Namuna:
def __init__(self, y) :
self.x = y
def __add__(self, y): # + operatorini qayta yuklash
print("nusxa chap tomonda")
return self.x+y
def __radd__(self, y): # + operatorini qayta yuklash
print("nusxa oʻng tomonda")
return self.x + y
def __iadd__(self, y): # += operatorini qayta yuklash
print("qoʻshib qiymat berish")
self.x += y
return self
c = Namuna(50)
print(c + 10) # chiqaradi: nusxa chap tomonda 60
print(20 + c) # chiqaradi: nusxa oʻng tomonda 70
c += 30 # chiqaradi: qoʻshib qiymat berish
print(c.x) # chiqaradi: 80
13.7. Abstrakt metodlar Abstrakt metodlar amalda qoʻllanmaydigan metodlarni oʻz ichiga oladi. Odatda, hosila sinf bunday metodlarni qayta aniqlaydi va unung funksiyalarini amalga oshirishda yordam beradi deb faraz qilinadi. Bunday farazni roʻyobga chiqarish abstract metodlar ichida istisnoli vaziyatlarni yuzaga keltiriladi.
class Class1:
def func(self, x): # abstrakt metod.
# raise yordamida istisnoli vaziyat yuzaga keltirilmoqda
raise NotImplementedError("Metodni qayta aniqlash kerak.")
class Class2(Class1): # abstrakt metod - voris
def func(self, x): # metodni qayta aniqlash
print(x)
class Class3(Class1): # sinf metodni qayta aniqlamaydi
pass
c2 = Class2()
c2.func(50) # chiqaradi: 50
c3 = Class3()
try: # istisnoli vaziyatni tutib qolish
c3.func(50) # Hato! func() metodi qayta aniqlanmagan
except NotImplementedError as msg:
print(msg) # chiqaradi: Metodni qayta aniqlash kerak.
Python tilining standart kutubxonasiga abc moduli ham kiradi. Bu metod tarkibida oʻzidan oldin turgam metodning abstraktligini koʻrsatuvchi @abstractmethod dekoratori mavjud. Tarkibida abstract metod aniqlanmagan hosila sinfi nusxasini yaratishga urinish boʻlganda TypeError istisnoli vaziyati yuzaga keladi. Quyida @abstractmethod dekoratoriga namuna keltirilmoqda.
from abc import ABCMeta, abstractmethod
class Class1(metaclass=ABCMeta):
@abstractmethod
def func(self, x): # Abstrakt metod
pass
class Class2(Class1): # abstrakt metod - voris
def func(self, x): # metodni qayta aniqlash
print (x)
class Class3(Class1) : # sinf metodni qayta aniqlamaydi
pass
c2 = Class2()
c2.func(50) # chiqaradi: 50
try:
c3 = Class3() # Hato!. func() metodi qayta aniqlanmagan
c3.func(50)
except TypeError as msg:
print(msg) # func abstrakt metodi yordamida
# Class3 abstrakt sinfi nusxasini yaratib boʻlmadi
Abstrakt statik metodlar hamda sinflarning abstract metodlarini yaratish imkoniyati mavjud va buning uchun zarur dekoratorlar bir vaqtning oʻzida ketma-ket koʻrsatiladi. Quyida abstrakt statik metodi va sinfning abstract metodi boʻlgan sinf e’lon qilinmoqda:
from abc import ABCMeta, abstractmethod
class Namuna(metaclass=ABCMeta):
@staticmethod
@abstractmethod
def static_func(self, x): # statik abstract metod
pass
@classmethod
@abstractmethod
def class_func(self, x): # sinfning abstrakt metodi
pass