Python
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.
Örnek çözümü göster
# 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)
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.
Kendini test et
-
Metaprogramming kavramlarını eşleştir
- Field
- Descriptor
- ModelMeta
- Metaclass
- __set_name__
- Ad bildirimi
- Model.fields
- Alan listesi
-
Field descriptor ne yapar?
- Alan adını kaydeder
- C kütüphanesi yükler
- Süreç başlatır
- Dizi hesaplar
Cevabı göster
Alan adını kaydeder — Field, __set_name__ ile alan adını Model.fields listesine kaydeder.
-
ModelMeta tanımını tamamla
class ModelMeta(____):
def __new__(mcs, name, bases, ns):
return super().__new__(mcs, name, bases, ns)
Cevabı göster
class ModelMeta(type):
def __new__(mcs, name, bases, ns):
return super().__new__(mcs, name, bases, ns)
Sıradaki ders: Multiprocessing