Ö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)