Python
Ö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.
Örnek çözümü göster
# 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)
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.
Kendini test et
-
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
Cevabı göster
@decorator ile sınıfı sarma — @decorator sınıfı sarar; örnek oluşturma __init__ işidir.
-
Tüm metaprogramming kavramlarını eşleştir
- type()
- Dinamik sınıf
- metaclass
- Sınıf üretimi
- __init_subclass__
- Alt sınıf kanca
- @decorator
- Sınıf sarma
-
Son boşluk
class ModelMeta(type):
def __new__(mcs, name, bases, ns):
return super().____(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: Descriptor protokolü