Non-data descriptor
- Python kursu
- Uzman
- Ders 9/47
- 5 dk
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
# Squared descriptor yaz
# Math sınıfında kullan
# sonucu yazdırÖrnek çözüm
# 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
class Squared:
def ______(self, obj, objtype=None):
return self.base ** 2
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?
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.