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

Dynamic Class Creation

class Example: ... yazmak ile type('Example', (), {...}) çağırmak tamamen aynı sonucu verir. Python class anahtar kelimesini sahne arkasında type() çağrısına dönüştürür.

Dynamic Class Creation

class anahtar kelimesi sözdizimsel bir kolaylıktan ibarettir. Python bunu sahne arkasında type(name, bases, namespace) çağrısına dönüştürür. Aşağıdaki iki tanım tamamen aynı sınıfı üretir:

class Example:
	attr = 1

	def method(self):
		return "method"

name = "Example"
bases = ()
namespace = {
	"attr": 1,
	"method": lambda self: "method"
}

Example = type(name, bases, namespace)

print(f"{Example.__class__=}")     # <class 'type'>
print(f"{Example().attr=}")        # 1
print(f"{Example().method()=}")    # 'method'
assert isinstance(Example, type)
assert isinstance(Example(), Example)

Üç Argüman

type(name, bases, namespace) çağrısında:

  • name — sınıfın adı (__name__ niteliğine yazılır).
  • bases — miras alınan sınıfların demeti; boş demet object’ten türetmek anlamına gelir.
  • namespace — sınıf gövdesindeki tüm atamaları içeren sözlük: nitelikler, metodlar, __module__, __qualname__ vb.

Neden Önemli?

Dinamik sınıf oluşturma; sınıf adlarını veya niteliklerini çalışma zamanında belirlemeniz gereken durumlarda kullanışlıdır — örneğin bir ORM’nin tablo tanımlarını kod üretirken, ya da bir plugin sisteminde eklentileri kayıt altına alırken. Metaclass’ları anlamanın ilk adımı da budur: metaclass, type’ın yerine geçen ve bu type(name, bases, namespace) çağrısını kontrol eden bir sınıftır.

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