CodeBlanks Logo Icon CodeBlanks

slots ve tuple

__slots__ ve tuple ile bellek tasarrufu öğrenirsin.

__slots__ nedir?

__slots__, bir sınıfın örneklerinin __dict__ oluşturmasını engeller. Bunun yerine yalnızca belirtilen alanlar için yer ayrılır; bellek tasarrufu sağlar.

Normalde her örnek bir __dict__ sözlüğü taşır; bu, dinamik öznitelik eklemeye izin verir ama bellek harcar. __slots__ = ['x', 'y'] tanımlarsan örnekler yalnızca bu alanları taşır; __dict__ olmaz. Binlerce örnek oluşturulduğunda tasarruf önemlidir. Ama dinamik öznitelik eklenemez; bu bir trade-off'tür.

Bellek tasarrufu ölçmek

hasattr(obj, '__dict__') ile bir örneğin __dict__ taşıyıp taşımadığını kontrol edersin. __slots__ tanımlı bir sınıfta bu False döner.

Normal bir sınıfta ise True döner. Bu, slots'un çalıştığını doğrulamanın en basit yoldur. Bellek tasarrufunu ölçmek için sys.getsizeof kullanırsın; ama __dict__'in kendisi ayrı bir nesnedir ve getsizeof onu saymaz. Tam tasarrufu görmek için __dict__ boyutunu da eklemek gerekir.

Uygulama slots ile __dict__ karşılaştır

WithSlots sınıfı yaz; __slots__ = ['x', 'y'] tanımla. WithoutSlots sınıfı yaz (slots yok). Her iki sınıftan örnek oluştur; WithSlots'a x=1, y=2, WithoutSlots'a da x=1, y=2 ata. hasattr(a, '__dict__') ve hasattr(b, '__dict__')'i ayrı satırlarda yazdır.

Başlangıç kodu

main.py
# iki sınıf yaz: biri slots'lu
# örnek oluştur ve __dict__ kontrol et

Örnek çözüm

main.py
class WithSlots:
    __slots__ = ["x", "y"]

class WithoutSlots:
    pass

a = WithSlots()
a.x = 1
a.y = 2
b = WithoutSlots()
b.x = 1
b.y = 2
print(hasattr(a, "__dict__"))
print(hasattr(b, "__dict__"))

Beklenen çıktı

False
True

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 slots kavramlarını eşleştir

Kavram Anlamı
__slots__ Alan listesi
__dict__ Dinamik sözlük
bellek Tasarruf sağlar
trade-off Esneklik azalır

2 __slots__ neyi engeller?

main.py
class Point:
    __slots__ = ['x', 'y']
  • __dict__ oluşturulmasını Doğru cevap
  • Kalıtımı
  • Metot tanımlarını
  • __init__ çağrılmasını

Açıklama: __slots__ örneklerin __dict__ taşımasını engeller; bellek tasarrufu sağlar.

3 __slots__ tanımını tamamla

Soru
class Point:
    ____ = ['x', 'y']
Cevap
class Point:
    __slots__ = ['x', 'y']

Açıklama: __slots__ = ['x', 'y'] alanları belirtir.

Uzman bölümündeki tüm dersler