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

Metaclasses In Python

Metaclass, örnekleri sınıf olan bir sınıftır. type nasıl int veya str gibi sınıflar üretiyorsa, özel bir metaclass da kendi sınıflarını aynı şekilde üretir.

Metaclasses In Python

Sınıf oluşturma aşamasına bir ara katman eklemek için metaclass kullanılır. type’tan türeyen her sınıf bir metaclass olabilir; type ise Python’ın varsayılan metaclass’ıdır.

class Meta(type):
    pass

class Example(metaclass=Meta):
    attr = 1

    def method(self):
        return "method"

print(f"{Meta.__class__=}")       # <class 'type'>
print(f"{Example.__class__=}")    # <class '__main__.Meta'>
print(f"{Example().__class__=}")  # <class '__main__.Example'>

print(f"{Example().attr=}")        # 1
print(f"{Example().method()=}")    # 'method'

assert isinstance(Meta, type)
assert isinstance(Example, Meta)
assert isinstance(Example(), Example)

Çıktı Ne Söylüyor?

  • Meta.__class__<class 'type'> — Meta’nın kendisi type’ın bir örneğidir; yani Meta bir sınıftır, dolayısıyla tipi type.
  • Example.__class__<class '__main__.Meta'> — Example artık type tarafından değil Meta tarafından oluşturulmuştur; tipi Meta’dır.
  • Example().__class__<class '__main__.Example'> — sıradan örnekler beklendiği gibi kendi sınıflarını döndürür.

assert Satırları

assert isinstance(Meta, type)       # Meta, type'ın bir örneğidir (Meta bir sınıftır)
assert isinstance(Example, Meta)    # Example, Meta'nın bir örneğidir (Meta bir metaclass'tır)
assert isinstance(Example(), Example)  # Örnekler kendi sınıflarının birer örneğidir

Analoji

typeint ilişkisi ile MetaExample ilişkisi özdeştir:

  • type, int sınıfını oluşturmak için kullanılır; int’in tipi type’tır.
  • Meta, Example sınıfını oluşturmak için kullanılır; Example’ın tipi Meta’dır.

Metaclass bu noktada işe yarar: sınıf oluşturulurken Meta.__new__, Meta.__init__ veya Meta.__call__ metodlarını override ederek sınıf tanımlama davranışını değiştirebilirsiniz.

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ı.