Python
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.
Örnek çözümü göster
# 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)
Kendini test et
-
Data descriptor kavramlarını eşleştir
- __get__
- Okuma yakalar
- __set__
- Yazma yakalar
- __delete__
- Silme yakalar
- data descriptor
- Hem get hem set
-
Data descriptor hangilerini içerir?
- Yalnızca __set__
- Yalnızca __get__
- __get__ ve __set__
- Yalnızca __delete__
Cevabı göster
__get__ ve __set__ — Data descriptor ikisini de uygular.
-
__set__ imzasını tamamla
def __set__(self, obj, ____):
self.value = value
Cevabı göster
def __set__(self, obj, value):
self.value = value
Sıradaki ders: Non-data descriptor