Özel Üst Sınıflar Yazma
Sınıf oluşturmayı özelleştirmek için üst sınıflarda __new__ ve __init__ kullanın.
Özel Üst Sınıflar Yazma, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
Meta Sınıf Tanımlama
Özel bir meta sınıf kullanmak için sınıf tanımına metaclass=MyMeta aktarın. Meta sınıf, type sınıfından türemelidir.
class MyMeta(type):
pass
class Foo(metaclass=MyMeta):
pass
print(type(Foo)) # <class '__main__.MyMeta'>__new__ Yöntemini Geçersiz Kılma
__new__(mcs, name, bases, namespace), sınıf nesnesini oluşturur. Sınıf oluşturulmadan önce ad alanını değiştirmek için bu yöntemi kullanın.
class UpperAttrMeta(type):
def __new__(mcs, name, bases, namespace):
upper = {k.upper(): v for k, v in namespace.items()
if not k.startswith("_")}
return super().__new__(mcs, name, bases, {**namespace, **upper})
class Config(metaclass=UpperAttrMeta):
debug = True
print(Config.DEBUG) # True__init__ Yöntemini Geçersiz Kılma
__init__(cls, name, bases, namespace), sınıf oluşturulduktan sonra çalışır. Kayıt işlemi gibi oluşturma sonrası kurulumlar için bunu kullanın.
_registry = {}
class AutoRegisterMeta(type):
def __init__(cls, name, bases, namespace):
super().__init__(name, bases, namespace)
if bases: # skip the base class itself
_registry[name] = cls
class Handler(metaclass=AutoRegisterMeta): pass
class JSONHandler(Handler): pass
class XMLHandler(Handler): pass
print(_registry) # {'JSONHandler': ..., 'XMLHandler': ...}Arayüz Sözleşmelerini Zorunlu Kılma
Sınıf gövdesinde gerekli yöntemler eksikse __new__ içinde TypeError oluşturun.
class InterfaceMeta(type):
REQUIRED = frozenset({"process", "validate"})
def __new__(mcs, name, bases, ns):
if bases and not mcs.REQUIRED.issubset(ns):
missing = mcs.REQUIRED - ns.keys()
raise TypeError(f"{name} must define: {missing}")
return super().__new__(mcs, name, bases, ns)
class Worker(metaclass=InterfaceMeta):
def process(self): ...
def validate(self): ...Meta Sınıf ile Singleton
Örnek oluşturmayı araya girerek denetlemek ve her seferinde aynı örneği döndürmek için meta sınıf üzerindeki __call__ yöntemini geçersiz kılın.
class SingletonMeta(type):
_instances = {}
def __call__(cls, *a, **kw):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*a, **kw)
return cls._instances[cls]
class DB(metaclass=SingletonMeta):
pass
print(DB() is DB()) # TrueYöntemleri Dinamik Olarak Ekleme
Meta sınıfı kullanan her sınıfa, sınıfları tek tek değiştirmeden yardımcı yöntemler ekleyin.
class MethodInjectorMeta(type):
def __new__(mcs, name, bases, ns):
ns["describe"] = lambda self: f"I am {type(self).__name__}"
return super().__new__(mcs, name, bases, ns)
class Widget(metaclass=MethodInjectorMeta):
pass
print(Widget().describe()) # I am WidgetSıralı Ad Alanı için __prepare__
Sınıf ad alanı olarak özel bir eşleme sağlamak için __prepare__ yöntemini geçersiz kılın; örneğin tanım sırasını koruyabilir veya yinelenenleri algılayabilirsiniz.
class NoDuplicatesMeta(type):
class _NS(dict):
def __setitem__(self, k, v):
if k in self and not k.startswith("_"):
raise ValueError(f"Duplicate attribute: {k}")
super().__setitem__(k, v)
@classmethod
def __prepare__(mcs, name, bases):
return mcs._NS()Meta Sınıf Çakışmasını Çözümleme
Birden çok temel sınıfın farklı meta sınıfları olduğunda Python, en türemiş meta sınıfın açıkça kullanılmasını gerektirir; aksi halde bir çakışma hatası oluşturulur.
class MetaA(type): pass
class MetaB(type): pass
# class Bad(A, B): pass # TypeError: metaclass conflict
class MetaAB(MetaA, MetaB): pass # resolve manually
class A(metaclass=MetaA): pass
class B(metaclass=MetaB): pass
class Good(A, B, metaclass=MetaAB): passMeta Sınıf ve __init_subclass__ Karşılaştırması
Alt sınıfları kaydetmek ve basit kancalar oluşturmak için __init_subclass__ daha basittir ve meta sınıf gerektirmez.
class Base:
_registry = []
def __init_subclass__(cls, **kw):
super().__init_subclass__(**kw)
Base._registry.append(cls)
class ChildA(Base): pass
class ChildB(Base): pass
print(Base._registry) # [ChildA, ChildB]Öznitelik Erişimini İzleme
Sınıf üzerindeki (örnekler üzerindeki değil) öznitelik erişimini araya girerek denetlemek için meta sınıf üzerindeki __getattribute__ yöntemini geçersiz kılın.
class TraceMeta(type):
def __getattribute__(cls, name):
val = super().__getattribute__(name)
if not name.startswith("_"):
print(f"Accessing class attr: {name}")
return val
class Config(metaclass=TraceMeta):
HOST = "localhost"
_ = Config.HOST # logs: Accessing class attr: HOSTORM Alan Toplama Deseni
Django tarzı ORM'ler, sınıf gövdesindeki Field tanımlayıcılarını bir _meta kayıt defterinde toplamak için meta sınıfları kullanır.
class Field:
def __init__(self, col): self.col = col
class ModelMeta(type):
def __new__(mcs, name, bases, ns):
fields = {k: v for k, v in ns.items() if isinstance(v, Field)}
ns["_fields"] = fields
return super().__new__(mcs, name, bases, ns)
class User(metaclass=ModelMeta):
name = Field("name")
email = Field("email")
print(User._fields.keys()) # dict_keys(['name', 'email'])Hızlı Kontrol
Özel bir meta sınıfta, sınıf nesnesinin kendisini oluşturmak için (__init__ öncesinde) hangi yöntem çağrılır?
Özet
Özel meta sınıflar, sınıf oluşturmayı denetlemek için __new__/__init__ yöntemlerini geçersiz kılar: sözleşmeleri zorunlu kılar, alt sınıfları otomatik olarak kaydeder, yöntemler ekler veya alan tanımlayıcılarını toplar. Basit kayıt gereksinimleri için __init_subclass__ yöntemini tercih edin.
Sıkça Sorulan Sorular
“Özel Üst Sınıflar Yazma” dersi ücretsiz mi?
Evet — “Özel Üst Sınıflar Yazma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“Özel Üst Sınıflar Yazma” dersinde ne öğreneceğim?
Sınıf oluşturmayı özelleştirmek için üst sınıflarda __new__ ve __init__ kullanın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Özel Üst Sınıflar Yazma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Python Sınıfları Nasıl Oluşturulur
- Özel Üst Sınıflar Yazma
- Tanımlayıcılar: __get__, __set__, __delete__
- __slots__ ve Bellek Optimizasyonu