slots ve tuple
- Python kursu
- Uzman
- Ders 40/47
- 5 dk
__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
# iki sınıf yaz: biri slots'lu
# örnek oluştur ve __dict__ kontrol etÖrnek çözüm
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?
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
class Point:
____ = ['x', 'y']
class Point:
__slots__ = ['x', 'y']
Açıklama: __slots__ = ['x', 'y'] alanları belirtir.