Descriptor protokolü
- Python kursu
- Uzman
- Ders 7/47
- 5 dk
__get__, __set__, __delete__ ile descriptor'ı öğrenirsin.
Descriptor protokolü nedir?
Bir descriptor, __get__, __set__ veya __delete__ yöntemlerinden en az birini uygulayan bir nesnedir. Sınıf düzeyinde bir öznitelik olarak kullanıldığında Python erişimi bu yöntemlerden geçirir.
Örneğin class Descriptor: def __get__(...) yazıp Box.label = Descriptor() dersen, box.label okunduğunda __get__ çağrılır. Bu mekanizma, property, classmethod ve super()'ın temelidir. Doğrulama, hesaplama ve önbellekleme için kullanışlıdır.
__get__ imzası
__get__(self, obj, objtype=None) imzası şöyledir: obj erişilen örnek, objtype ise sınıfın kendisidir.
Sınıf üzerinden erişilince (Box.label) obj None olur; örnek üzerinden erişilince (box.label) obj o örnek olur. Bu ayrım, sınıf düzeyi ile örnek düzeyi davranışı farklı kılmayı sağlar. Çoğu basit descriptor objtype'ı yok sayar ve yalnızca obj'yi kullanır.
Uygulama Descriptor ile öznitelik erişimi
Bir Descriptor sınıfı yaz. __init__(self, value) ile değeri sakla. __get__(self, obj, objtype=None) self.value'yu döndürsün. Box sınıfında label = Descriptor("kutu") tanımla. Örnek oluştur ve label özniteliğini yazdır.
Başlangıç kodu
# Descriptor sınıfı yaz
# Box sınıfında kullan
# değeri yazdırÖrnek çözüm
# Descriptor sınıfı yaz
class Descriptor:
def __init__(self, value):
self.value = value
def __get__(self, obj, objtype=None):
return self.value
class Box:
label = Descriptor("kutu")
b = Box()
print(b.label)Beklenen çıktı
kutu
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangi yöntem descriptor protokolüne ait?
- __get__ Doğru cevap
- __init__
- __str__
- __repr__
Açıklama: __get__ descriptor protokolünün okuma yöntemidir.
2 Descriptor yöntemlerini eşleştir
| Kavram | Anlamı |
|---|---|
__get__ |
Okuma |
__set__ |
Yazma |
__delete__ |
Silme |
descriptor |
Sınıf özniteliği |
3 __get__ imzasını tamamla
def __get__(self, obj, ____):
return self.value
def __get__(self, obj, objtype=None):
return self.value
Açıklama: objtype varsayılan olarak None alır; sınıf erişiminde doludur.