· Hakan Çelik · Python / Metaclass · 1 dk okuma

Invisible Metaclasses In Python

Python'da her sınıfın bir metaclass'ı vardır. Açıkça belirtmezseniz type varsayılan olarak devreye girer — görünmez ama her zaman oradadır.

Invisible Metaclasses In Python

Python’da her sınıfın bir metaclass’ı vardır. Bunu açıkça belirtmezseniz Python, varsayılan olarak type metaclass’ını kullanır. Yani aşağıdaki iki sınıf tanımı tamamen aynı anlama gelir:

class K(metaclass=type):
    pass

class Example(K, metaclass=type):
    pass

Yukarıdaki kodda metaclass=type açıkça yazılmıştır. Ancak bunu yazmadan da aynı sonucu elde edersiniz:

class K:
    pass

class Example(K):
    pass

Peki Bu Ne Anlama Gelir?

type, Python’da metaclass hiyerarşisinin en tepesinde yer alır. Bir sınıf tanımladığınızda Python sahne arkasında şunları yapar:

>>> type(K)
<class 'type'>

>>> type(Example)
<class 'type'>

Her iki yaklaşımda da sınıfın type’ı type’tır; çünkü metaclass belirtilmediğinde Python otomatik olarak type’ı devreye sokar. İşte “görünmez metaclass” davranışı budur — siz görmezsiniz, ama her zaman oradadır.

Miras ve Metaclass

Bir sınıf miras aldığında parent sınıfın metaclass’ı da devralınır. Example(K) örneğinde K’nın metaclass’ı type olduğu için Example’ın metaclass’ı da type olur. Özel bir metaclass tanımladığınızda bu davranış değişir:

class Meta(type):
    pass

class K(metaclass=Meta):
    pass

class Example(K):  # Meta devralınır, type değil
    pass

>>> type(Example)
<class '__main__.Meta'>

Neden Önemli?

type metaclass’ı çoğu durumda görünmez kalır; ancak kendi metaclass’ınızı yazarken veya bir kütüphanenin metaclass’ını incelerken bu varsayılan davranışı anlamak kritik öneme sahiptir. Metaclass belirtilmemesi “metaclass yok” anlamına gelmez; sadece type sessizce işini yapar.

Back to Blog

Related Posts

View All Posts »
Understanding Python Classes

Understanding Python Classes

Python · 2 dk

Python'da her şey nesnedir ve her nesnenin bir tipi vardır — primitifler, fonksiyonlar ve sınıfların kendisi de dahil. type() ve __class__ bu ilişkiyi ortaya çıkarır.

Run Methods Order In Python

Run Methods Order In Python

Python · 2 dk

Python metaclass'larında hangi metot ne zaman çalışır? Sınıf tanımı ve örnek oluşturma sırasındaki __prepare__, __new__, __init__, __call__ çalışma sırası.