Özet - Descriptor'lar
- Python kursu
- Uzman
- Ders 12/47
- 5 dk
__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
# Validated descriptor yaz
# Product sınıfında kullan
# fiyatı yazdırÖrnek çözüm
# 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
class Validated:
def __set_name__(self, owner, name):
self.name = name
self.value = ____
def __get__(self, obj, objtype=None):
return self.value
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.