CodeBlanks Logo Icon CodeBlanks

Descriptor protokolü

__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

main.py
# Descriptor sınıfı yaz
# Box sınıfında kullan
# değeri yazdır

Örnek çözüm

main.py
# 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

Soru
def __get__(self, obj, ____):
    return self.value
Cevap
def __get__(self, obj, objtype=None):
    return self.value

Açıklama: objtype varsayılan olarak None alır; sınıf erişiminde doludur.

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