Python
__set_name__
__set_name__ ile isim bilgisini öğrenirsin.
__set_name__ nedir?
__set_name__(self, owner, name), bir descriptor sınıf özniteliği olarak atandığında Python tarafından otomatik çağrılır. owner sınıf, name ise özniteliğin adıdır.
Bu, descriptor'ın hangi isimle tanımlandığını bilmesini sağlar. Örneğin class Config: host = TrackedField() yazınca TrackedField.__set_name__ name="host" ile çağrılır. Böylece descriptor, hata mesajlarında veya günlüklemede kendi adını kullanabilir. Bu yöntem Python 3.6'da eklendi ve metaclass gerektirmeden isim farkındalığı sağlar.
İsim bilgisini kullanmak
__set_name__'den alınan name değerini çeşitli şekillerde kullanabilirsin. En yaygın iki yol: hata mesajına eklemek ve __get__'te dönüştürülmüş değer üretmek.
Örneğin self.name = name saklayıp __get__'te f"{self.name} hazır" döndürebilirsin. Bu, descriptor'ın hangi özniteliğe bağlı olduğunu bilmesini sağlar ve hata ayıklamayı kolaylaştırır. Ayrıca owner parametresi ile sahibi sınıfa da erişebilirsin; böylece sınıf düzeyinde kayıt yapabilirsin.
Uygulama __set_name__ ile isim kaydı
Bir TrackedField descriptor yaz. __set_name__(self, owner, name) içinde self.name = name yap. __get__(self, obj, objtype=None) f"{self.name} izli" döndürsün. Config sınıfında host = TrackedField() tanımla. Örnek oluştur ve host'u yazdır.
Örnek çözümü göster
# TrackedField descriptor yaz
class TrackedField:
def __set_name__(self, owner, name):
self.name = name
def __get__(self, obj, objtype=None):
return f"{self.name} tracked"
class Config:
host = TrackedField()
c = Config()
print(c.host)
Kendini test et
-
__set_name__ kavramlarını eşleştir
- __set_name__
- Ad bildirimi
- owner
- Sahip sınıf
- name
- Öznitelik adı
- otomatik
- Python çağırır
-
__set_name__ imzasını tamamla
def __set_name__(self, owner, ____):
self.name = name
Cevabı göster
def __set_name__(self, owner, name):
self.name = name
-
__set_name__ ne zaman çağrılır?
class TrackedField:
def __set_name__(self, o, n):
print(n)
class Config:
host = TrackedField()
- Örnek oluşturulunca
- Sınıf tanımlanırken otomatik
- Yalnızca __get__ çağrılınca
- Program kapanırken
Cevabı göster
Sınıf tanımlanırken otomatik — __set_name__, Config sınıfı tanımlandığı an otomatik çağrılır; örnek gerekmez.
Sıradaki ders: Özet - Descriptor'lar