__set_name__
- Python kursu
- Uzman
- Ders 11/47
- 5 dk
__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.
Başlangıç kodu
# TrackedField descriptor yaz
# Config sınıfında kullan
# değeri yazdırÖrnek çözüm
# 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)Beklenen çıktı
host tracked
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 __set_name__ kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
__set_name__ |
Ad bildirimi |
owner |
Sahip sınıf |
name |
Öznitelik adı |
otomatik |
Python çağırır |
2 __set_name__ imzasını tamamla
def __set_name__(self, owner, ____):
self.name = name
def __set_name__(self, owner, name):
self.name = name
Açıklama: name parametresi özniteliğin adını taşır.
3 __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 Doğru cevap
- Yalnızca __get__ çağrılınca
- Program kapanırken
Açıklama: __set_name__, Config sınıfı tanımlandığı an otomatik çağrılır; örnek gerekmez.