CodeBlanks Logo Icon CodeBlanks

Özet - Metaprogramming

type, metaclass ve __init_subclass__'ı birleştirerek bir DSL yazarsın.

Özet: metaprogramming araçları

Bu grupta dört aracı öğrendin. type() ile dinamik sınıf, metaclass ile sınıf yaratımına müdahale, __init_subclass__ ile hafif kanca, __class_getitem__ ile alt simge, @decorator ile sınıfı sarma.

Şimdi bunları birleştirip bir mini DSL yazacaksın: bir Field descriptor'ı ve bir ModelMeta metaclass'ı. Field, __set_name__ ile adını öğrenir; metaclass, alanları toplayıp fields listesine koyar. Bu, Django ve SQLAlchemy gibi araçların çekirdek fikridir.

Uygulama Mini DSL: Field + metaclass

Bir Field sınıfı yaz. __set_name__(self, owner, name) yöntemi eklesin; self.name = name yapsın, owner'da fields listesi yoksa owner.fields = [] oluştursun ve name'i eklesin. ModelMeta(type) metaclass yaz; __new__ içinde super().__new__ döndürsün. User(metaclass=ModelMeta) sınıfında name = Field() tanımla. User.fields'i yazdır.

Başlangıç kodu

main.py
# Field descriptor ve ModelMeta yaz
# User sınıfında Field kullan
# alan adlarını yazdır

Örnek çözüm

main.py
# Field descriptor ve ModelMeta yaz
class Field:
    def __set_name__(self, owner, name):
        self.name = name
        if not hasattr(owner, "fields"):
            owner.fields = []
        owner.fields.append(name)

class ModelMeta(type):
    def __new__(mcs, name, bases, ns):
        return super().__new__(mcs, name, bases, ns)

class User(metaclass=ModelMeta):
    name = Field()

print(User.fields)

Beklenen çıktı

['name']

Ne öğrendin?

Bu grupta Python'ın sınıf yaratım mekanizmasını derinlemesine gördün. type() ile sınıfı elle kurmayı, metaclass ile bu sürece müdahale etmeyi, __init_subclass__ ile hafif kanca yazmayı öğrendin.

Ayrıca __class_getitem__ ile jenerik görünümlü API'ler ve @decorator ile sınıflara sonradan davranış eklemeyi gördün. Özet derste bunları birleştirip bir mini DSL yazdın: Field descriptor + metaclass. Bu desen, büyük Python çatılarının omurgasıdır.

Soru ve cevaplar

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

1 Hangi araç hangi iş?

  • type() ile dinamik sınıf
  • __init_subclass__ ile alt sınıf kanca
  • metaclass ile örnek oluşturma
  • @decorator ile sınıfı sarma Doğru cevap

Açıklama: @decorator sınıfı sarar; örnek oluşturma __init__ işidir.

2 Tüm metaprogramming kavramlarını eşleştir

Kavram Anlamı
type() Dinamik sınıf
metaclass Sınıf üretimi
__init_subclass__ Alt sınıf kanca
@decorator Sınıf sarma

3 Son boşluk

Soru
class ModelMeta(type):
    def __new__(mcs, name, bases, ns):
        return super().____(mcs, name, bases, ns)
Cevap
class ModelMeta(type):
    def __new__(mcs, name, bases, ns):
        return super().__new__(mcs, name, bases, ns)

Açıklama: super().__new__ asıl sınıf nesnesini üretir.

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