Python
Ö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.
Örnek çözümü göster
# 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)
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.
Kendini test et
-
Hangi descriptor türü?
- data descriptor yalnız __get__ uygular
- property non-data'dır
- Non-data örnek sözlüğü tarafından ezilir
- __set_name__ örnek düzeyinde çağrılır
Cevabı göster
Non-data örnek sözlüğü tarafından ezilir — non-data örnek sözlüğü tarafından ezilir. __set__ olmadığı için yazmaya karışmaz.
-
Tüm descriptor kavramlarını eşleştir
- __get__
- Okuma
- __set__
- Yazma
- __set_name__
- Ad bildirimi
- property
- Data descriptor
-
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
Cevabı göster
class Validated:
def __set_name__(self, owner, name):
self.name = name
self.value = 0
def __get__(self, obj, objtype=None):
return self.value
Sıradaki ders: ast.parse