CodeBlanks Logo Icon CodeBlanks

Non-data descriptor

Yalnızca __get__ olan non-data descriptor'ı öğrenirsin.

Non-data descriptor nedir?

Bir non-data descriptor yalnızca __get__ uygular; __set__ yoktur. Okumayı yakalar ama yazmaya karışmaz.

Bu farkın önemli bir sonucu var: örnek sözlüğündeki (obj.__dict__) aynı isimli girdi, non-data descriptor'ı ezer. Yani box.label = "yeni" yazarsan bu değer örnek sözlüğüne konur ve sonraki okumada descriptor değil bu değer döner. classmethod ve staticmethod non-data descriptor'dır. Bu esneklik, geçersiz kılmaya izin veren basit hesaplamalar için idealdir.

Öncelik sırası

Python öznitelik erişiminde şu önceliği izler: önce data descriptor, sonra örnek sözlüğü (obj.__dict__), sonra non-data descriptor, en son sınıf sözlüğü.

Bu sıra, neden property'nin (data descriptor) örnek değeri ezdiğini ama classmethod'un (non-data descriptor) ezilebildiğini açıklar. Data descriptor her zaman kazanır çünkü __set__ uyguladığı için yazma da ondan geçer. Non-data descriptor sadece okuma anında devreye girer ve örnek sözlüğünde değer varsa geri çekilir.

Uygulama Non-data descriptor ile hesaplama

Bir Squared non-data descriptor yaz. __init__(self, base) ile self.base'i sakla. __get__(self, obj, objtype=None) self.base ** 2 döndürsün. Math sınıfında area = Squared(5) tanımla. Örnek oluştur ve area'yı yazdır.

Başlangıç kodu

main.py
# Squared descriptor yaz
# Math sınıfında kullan
# sonucu yazdır

Örnek çözüm

main.py
# Squared descriptor yaz
class Squared:
    def __init__(self, base):
        self.base = base
    def __get__(self, obj, objtype=None):
        return self.base ** 2

class Math:
    area = Squared(5)

m = Math()
print(m.area)

Beklenen çıktı

25

Soru ve cevaplar

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

1 Non-data descriptor tanımını tamamla

Soru
class Squared:
    def ______(self, obj, objtype=None):
        return self.base ** 2
Cevap
class Squared:
    def __get(self, obj, objtype=None):
        return self.base ** 2

Açıklama: Non-data descriptor yalnızca __get__ uygular.

2 Non-data descriptor kavramlarını eşleştir

Kavram Anlamı
__get__ Okuma yakalar
__set__ yok Yazma serbest
örnek sözlüğü Descriptor'ı ezer
classmethod Non-data örneği

3 Non-data descriptor ne zaman ezilir?

main.py
class Desc:
    def __get__(self, o, t=None):
        return "a"

class C:
    x = Desc()

c = C()
c.x = "b"
print(c.x)
  • Hiç ezilmez
  • Örnek sözlüğüne değer yazılınca Doğru cevap
  • Sınıf erişiminde
  • Yalnızca __set__ tanımlanınca

Açıklama: c.x = "b" örnek sözlüğüne yazılır; non-data descriptor geri çekilir.

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