CodeBlanks Logo Icon CodeBlanks

Data descriptor

Hem __get__ hem __set__ olan data descriptor'ı öğrenirsin.

Data descriptor nedir?

Bir data descriptor, hem __get__ hem __set__ (ve isteğe bağlı __delete__) uygulayan descriptordur. Yazma erişimini denetleyebildiği için en güçlü türdür.

__set__(self, obj, value) imzası yazma anını yakalar. İçinde doğrulama yapabilir, değeri dönüştürebilir veya reddedebilirsin. Örnek sözlüğündeki (obj.__dict__) aynı isimli girdiyi ezer; bu yüzden örnek düzeyinde yazılsa bile her zaman descriptor devreye girer. Bu davranış, data descriptor'ı güvenilir doğrulama araçları yapar.

__set__ ile doğrulama

__set__(self, obj, value) içine bir if koyarak değeri doğrularsın. Geçersizse raise ValueError ile reddedersin; geçerliyse self.value = value ile saklarsın.

Önemli nokta: değer örnek üzerinde değil, descriptor'da saklanır. Yani self.value descriptor nesnesine aittir. Aynı descriptor sınıf düzeyinde tek bir nesne olduğu için tüm örnekler aynı değeri paylaşır. Örnek başına ayrı değer istiyorsan obj.__dict__ kullanmalısın; ama basit doğrulama için descriptor'da saklamak yeterlidir.

Uygulama Validated data descriptor

Bir NonNegative data descriptor yaz. __init__(self, value=0) ile başlangıç değeri sakla. __get__(self, obj, objtype=None) self.value'yu döndürsün. __set__(self, obj, value) içinde değer 0'dan küçükse ValueError fırlat; değilse self.value = value yap. Score sınıfında points = NonNegative(0) tanımla. Örnek oluştur, points = 10 ata ve yazdır.

Başlangıç kodu

main.py
# NonNegative descriptor yaz
# Score sınıfında kullan
# değeri yazdır

Örnek çözüm

main.py
# NonNegative descriptor yaz
class NonNegative:
    def __init__(self, value=0):
        self.value = value
    def __get__(self, obj, objtype=None):
        return self.value
    def __set__(self, obj, value):
        if value < 0:
            raise ValueError("negatif")
        self.value = value

class Score:
    points = NonNegative(0)

s = Score()
s.points = 10
print(s.points)

Beklenen çıktı

10

Soru ve cevaplar

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

1 Data descriptor kavramlarını eşleştir

Kavram Anlamı
__get__ Okuma yakalar
__set__ Yazma yakalar
__delete__ Silme yakalar
data descriptor Hem get hem set

2 Data descriptor hangilerini içerir?

  • Yalnızca __set__
  • Yalnızca __get__
  • __get__ ve __set__ Doğru cevap
  • Yalnızca __delete__

Açıklama: Data descriptor ikisini de uygular.

3 __set__ imzasını tamamla

Soru
def __set__(self, obj, ____):
    self.value = value
Cevap
def __set__(self, obj, value):
    self.value = value

Açıklama: value parametresi atanacak yeni değeri taşır.

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