Metaclass
- Python kursu
- Uzman
- Ders 2/47
- 5 dk
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
# Meta metaclass yaz
# __new__ ile sınıfa özellik ekle
# User sınıfını Meta ile tanımlaÖrnek çözüm
# 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
class Meta(____):
pass
class Meta(type):
pass
Açıklama: Bir metaclass, type'dan türetilir.
2 Metaclass __new__ ne zaman çağrılır?
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üğü |