CodeBlanks Logo Icon CodeBlanks

Metaprogramming

Metaclass ve descriptor'la DSL yazarsın.

Metaprogramming katmanı

Bu derste Tool sınıfının yanına bir Field descriptor ve ModelMeta metaclass ekleyeceksin. Field, __set_name__ ile adını öğrenir; ModelMeta, sınıf yaratımını yönetir.

Model sınıfı metaclass=ModelMeta ile tanımlanır ve ad = Field() içerir. Field'ın __set_name__ yöntemi, Model.fields listesine alan adını ekler. Bu, bildirimsel alan tanımının temelidir ve sonraki derslerde paralel işleme için kullanılacaktır.

Uygulama Field ve ModelMeta ekle

Başlangıç kodunda Tool sınıfı hazır. Şimdi Field descriptor sınıfı yaz: __set_name__(self, owner, name) içinde self.name = name yap, owner'da fields listesi yoksa oluştur ve name'i ekle. ModelMeta(type) metaclass yaz; __new__ içinde super().__new__ döndür. Model(metaclass=ModelMeta) sınıfında ad = Field() tanımla. Model.fields'i yazdır.

Başlangıç kodu

main.py
# Tool sınıfını type() ile oluştur
Tool = type("Tool", (), {
    "name": "arac",
    "run": lambda self: f"{self.name} calisti",
})

# Field descriptor ve ModelMeta ekle
# Model sınıfında Field kullan
# alanları yazdır

Örnek çözüm

main.py
# Tool sınıfını type() ile oluştur
Tool = type("Tool", (), {
    "name": "arac",
    "run": lambda self: f"{self.name} calisti",
})

# Field descriptor ve ModelMeta ekle
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 Model(metaclass=ModelMeta):
    ad = Field()

print(Model.fields)

Beklenen çıktı

['ad']

Sıradaki adım: multiprocessing

Field ve ModelMeta hazır. Sonraki derste paralel işleme katmanı ekleyeceksin: multiprocessing.Pool ile kare hesaplama yapacaksın.

Bu katman, veriyi paralel süreçlerle işleyecek ve performansı artıracak. Her ders bir katman ekler ve başlangıç kodu önceki çözümü taşır. Şimdiye kadar Tool, Field ve ModelMeta katmanları hazır. Bu temel, sonraki adımlar için sağlam bir zemin oluşturur.

Soru ve cevaplar

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

1 Metaprogramming kavramlarını eşleştir

Kavram Anlamı
Field Descriptor
ModelMeta Metaclass
__set_name__ Ad bildirimi
Model.fields Alan listesi

2 Field descriptor ne yapar?

  • Alan adını kaydeder Doğru cevap
  • C kütüphanesi yükler
  • Süreç başlatır
  • Dizi hesaplar

Açıklama: Field, __set_name__ ile alan adını Model.fields listesine kaydeder.

3 ModelMeta tanımını tamamla

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

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

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