Metaprogramming
- Python kursu
- Uzman
- Ders 44/47
- 6 dk
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
# 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
# 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
class ModelMeta(____):
def __new__(mcs, name, bases, ns):
return super().__new__(mcs, name, bases, ns)
class ModelMeta(type):
def __new__(mcs, name, bases, ns):
return super().__new__(mcs, name, bases, ns)
Açıklama: Bir metaclass type'dan türetilir.