CodeBlanks Logo Icon CodeBlanks

__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.

Başlangıç kodu

main.py
# TrackedField descriptor yaz
# Config sınıfında kullan
# değeri yazdır

Örnek çözüm

main.py
# 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

Soru
def __set_name__(self, owner, ____):
    self.name = name
Cevap
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?

main.py
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.

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