CodeBlanks Logo Icon CodeBlanks

Özet - Descriptor'lar

__get__, __set__ ve __set_name__'i birleştirerek bir Validated descriptor yazarsın.

Özet: descriptor'lar

Bu grupta descriptor protokolünü öğrendin. __get__ okuma, __set__ yazma, __delete__ silme yakalar. Data descriptor hem __get__ hem __set__ uygular; non-data descriptor yalnızca __get__.

@property'nin bir data descriptor olduğunu gördün. __set_name__ ile descriptor'ın adını öğrendin. Şimdi bunları birleştirip bir Validated descriptor yazacaksın: __set_name__ ile isim sakla, __get__ ile değeri döndür, __set__ ile negatif değeri reddet. Bu, gerçekçi bir doğrulama katmanıdır.

Uygulama Validated descriptor yaz

Bir Validated descriptor yaz. __set_name__(self, owner, name) içinde self.name = name ve self.value = 0 yap. __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. Product sınıfında price = Validated() tanımla. Örnek oluştur, price = 100 ata ve yazdır.

Başlangıç kodu

main.py
# Validated descriptor yaz
# Product sınıfında kullan
# fiyatı yazdır

Örnek çözüm

main.py
# Validated descriptor yaz
class Validated:
    def __set_name__(self, owner, name):
        self.name = name
        self.value = 0
    def __get__(self, obj, objtype=None):
        return self.value
    def __set__(self, obj, value):
        if value < 0:
            raise ValueError("negatif")
        self.value = value

class Product:
    price = Validated()

p = Product()
p.price = 100
print(p.price)

Beklenen çıktı

100

Ne öğrendin?

Bu grupta Python'ın en güçlü özelliklerinden birini öğrendin: descriptor protokolü. Öznitelik erişimini __get__, __set__ ve __delete__ ile yakaladın. Data ve non-data arasındaki öncelik farkını gördün.

@property'nin perde arkasında bir data descriptor olduğunu öğrendin. __set_name__ ile descriptor'lara isim farkındalığı ekledin. Özet derste üç yöntemi birleştirip bir Validated descriptor yazdın. Bu bilgi, Python çatılarının nasıl çalıştığını anlamak için kritiktir.

Soru ve cevaplar

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

1 Hangi descriptor türü?

  • data descriptor yalnız __get__ uygular
  • property non-data'dır
  • Non-data örnek sözlüğü tarafından ezilir Doğru cevap
  • __set_name__ örnek düzeyinde çağrılır

Açıklama: non-data örnek sözlüğü tarafından ezilir. __set__ olmadığı için yazmaya karışmaz.

2 Tüm descriptor kavramlarını eşleştir

Kavram Anlamı
__get__ Okuma
__set__ Yazma
__set_name__ Ad bildirimi
property Data descriptor

3 Son boşluk

Soru
class Validated:
    def __set_name__(self, owner, name):
        self.name = name
        self.value = ____
    def __get__(self, obj, objtype=None):
        return self.value
Cevap
class Validated:
    def __set_name__(self, owner, name):
        self.name = name
        self.value = 0
    def __get__(self, obj, objtype=None):
        return self.value

Açıklama: self.value = 0 ile başlangıç değeri verirsin.

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