Middle
202
Python'da slotlar nima?
AIdan javob
sobes.tech AI
Python'da (__slots__) slotlar, ya'ni __slots__, sinfning obyektining atributlarini aniq belgilash uchun ishlatiladi. Bu xotira foydalanishni optimallashtirishga imkon beradi va har bir obyekt uchun __dict__ lug'atini yaratishni oldini oladi.
Slotlardan foydalanishning afzalliklari:
- Xotira tejash: Slotlar bilan belgilangan sinf obyektlari kamroq xotira talab qiladi, chunki ular atributlar lug'atini saqlamaydi.
- Kirish tezligining minimal oshishi: Atributlarga to'g'ridan-to'g'ri kirish orqali kirish biroz tezroq bo'lishi mumkin.
- Dinamik atribut qo'shishni oldini olish:
__slots__da ko'rsatilmagan atributlarni qo'shish mumkin emas.
Slotlardan foydalanish cheklovlari:
__slots__bilan belgilangan sinflar ko'p meros ololmaydi, agar ular umumiy bazaga ega bo'lmasa.- Slotlar bilan sinflar istalgan atributlarni saqlay olmaydi; faqat
__slots__da ko'rsatilganlar. - Zaif havolalarni (
weakref) qo'llab-quvvatlash uchun'__weakref__'ni__slots__ga qo'shish kerak. - Holatni saqlash (
pickle) uchun'__dict__'ni__slots__ga qo'shish mumkin.
Foydalanish misoli:
class MyClassWithSlots:
__slots__ = ('x', 'y') # Ruxsat etilgan atributlarni belgilash
def __init__(self, x, y):
self.x = x
self.y = y
# Solishtirish uchun slots bo'lmagan sinf
class MyClassWithoutSlots:
def __init__(self, x, y):
self.x = x
self.y = y
# Xotira foydalanishini taqqoslash (taxminiy)
import sys
obj_with_slots = MyClassWithSlots(1, 2)
obj_without_slots = MyClassWithoutSlots(1, 2)
print(f"Slotlar bilan obyektning o'lchami: {sys.getsizeof(obj_with_slots)}")
print(f"Slotlar bo'lmagan obyektning o'lchami: {sys.getsizeof(obj_without_slots)}")
# Slotlar bilan obyektga yangi atribut qo'shish AttributeError xatosini keltirib chiqaradi
try:
obj_with_slots.yangi_atribut = "qiymat"
except AttributeError as e:
print(f"Slotlar bilan obyektga yangi atribut qo'shishda xato: {e}")
# Slotlar bo'lmagan obyektda __dict__ mavjud
print(f"Slotlar bo'lmagan obyekt __dict__ ga ega? {hasattr(obj_without_slots, '__dict__')}")
# Slotlar bilan obyektda __dict__ mavjud emas
print(f"Slotlar bilan obyekt __dict__ ga ega? {hasattr(obj_with_slots, '__dict__')}")