Özet - Metaprogramming
- Python kursu
- Uzman
- Ders 6/47
- 5 dk
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
# Field descriptor ve ModelMeta yaz
# User sınıfında Field kullan
# alan adlarını yazdırÖrnek çözüm
# 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
class ModelMeta(type):
def __new__(mcs, name, bases, ns):
return super().____(mcs, name, bases, ns)
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.