Python metaclass

Örneği bir sınıf olan sınıflara metaclass denir ve bütün metaclasslar type sınıfını miras olarak alır.

type 3 tane argüman alır. Bunlardan birincisi sınıfın ismi. İkinci argüman miras alınan sınıflar, üçüncüsü ise özelliklerdir.

Birinci argüman bir string verisidir. İkinci argüman bir tuple verisidir, üçüncü argüman ise bir sözlük verisidir.

Bir metaclass’ın oluşturulma şekli genelde şöyledir:

class MetaClass(type):
    def __new__(mcs, classname, superclasses, attributes):
        print("metaclass: ", mcs)
        print("classname: ", classname)
        print("superclasses: ", superclasses)
        print("attributes: ", attributes)
        return super().__new__(mcs, classname, superclasses, attributes)

Aşağıda da iki tane sıradan sınıflar var.

class SuperClass1:
    pass

class SuperClass2:
    pass

Bunların isimlerini SuperClass şeklinde yazdım, çünkü başka bir sınıf daha tanımlayacağız, bu iki sınıf miras alınan sınıflar olacak ve yukarıdaki MetaClass sınıfını tanımlayacağımız sınıfın metaclass’ı haline getireceğiz.

class Class(SuperClass1, SuperClass2, metaclass=MetaClass):
    pass

Class sınıfı SuperClass1 ve SuperClass2 sınıflarını miras olarak alıyor. Ve bir sınıf tanımlarken metaclass isimli bir parametreye MetaClass’ın ismi yazılır. Bu sınıfı tanımlar tanımlamaz, daha örneğini oluşturmadan şöyle bir yazı yazdırılması gerekiyor:

metaclass:  <class '__main__.MetaClass'>
classname:  Class
superclasses:  (<class '__main__.SuperClass1'>, <class '__main__.SuperClass2'>)
attributes:  {'__module__': '__main__', '__qualname__': 'Class'}

Şimdi aşağıdaki gibi bir sorgu yaparsanız, bu kodun AssertionError yükseltmediğini görürsünüz. Bu da demektir ki Class sınıfı, MetaClass sınıfının bir örneğidir. Aslında bütün sınıfların metaclass’ı type’dır.

assert isinstance(Class, MetaClass)
assert isinstance(MetaClass, type)
1 Beğeni