CodeBlanks Logo Icon CodeBlanks

Metaclass

class Meta(type) ile metaclass'ı öğrenirsin.

Metaclass nedir?

Bir metaclass, sınıfları üreten sınıftır. class Meta(type) tanımıyla kendi metaclass'ını yazarsın. Bir sınıf metaclass=Meta ile tanımlanınca, o sınıfın yaratılması Meta.__new__ tarafından kontrol edilir.

Metaclass __new__(mcs, name, bases, ns) yöntemini ezer; burada ns sınıfın ad alanıdır. İçine özellik ekleyebilir, yöntem değiştirebilirsin. type kendisi de bir metaclass'tır; tüm sınıflar ondan türetilir.

__new__ ile sınıf yapısını değiştir

Metaclass'ta __new__, sınıf nesnesi yaratılmadan önce çalışır. Ad alanı sözlüğüne (ns) yeni girdiler ekleyebilirsin; bu girdiler sınıfın özniteliği olur.

Örneğin ns["created_at"] = "meta" yazarsan, oluşan sınıfta created_at özelliği bulunur. super().__new__(mcs, name, bases, ns) çağrısıyla asıl sınıf nesnesini üretirsin. Bu desen, Django ORM gibi araçların temelini oluşturur.

Uygulama Meta metaclass ile sınıf oluşturma

Bir Meta(type) metaclass yaz. __new__(mcs, name, bases, ns) içinde ns sözlüğüne "created_at" anahtarını "meta" değeriyle ekle, sonra super().__new__ ile sınıfı döndür. User sınıfını metaclass=Meta ile tanımla. User.created_at değerini yazdır.

Başlangıç kodu

main.py
# Meta metaclass yaz
# __new__ ile sınıfa özellik ekle
# User sınıfını Meta ile tanımla

Örnek çözüm

main.py
# Meta metaclass yaz
class Meta(type):
    def __new__(mcs, name, bases, ns):
        ns["created_at"] = "meta"
        return super().__new__(mcs, name, bases, ns)

class User(metaclass=Meta):
    pass

print(User.created_at)

Beklenen çıktı

meta

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Metaclass tanımını tamamla

Soru
class Meta(____):
    pass
Cevap
class Meta(type):
    pass

Açıklama: Bir metaclass, type'dan türetilir.

2 Metaclass __new__ ne zaman çağrılır?

main.py
class Meta(type):
    def __new__(mcs, *a):
        print("yapiliyor")
        return super().__new__(mcs, *a)

class A(metaclass=Meta):
    pass
  • A sınıfı tanımlanırken
  • A() çağrıldığında
  • Program başlarken
  • Meta() çağrıldığında Doğru cevap

Açıklama: __new__ sınıf tanımı sırasında, yani Meta sınıfı çağrıldığında çalışır.

3 Metaclass kavramlarını eşleştir

Kavram Anlamı
Meta type'tan türetilir
__new__ Sınıfı üretir
mcs Metaclass kendisi
ns Ad alanı sözlüğü

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