Metaclasses In Python

- 1. Understanding Python Classes
- 2. Dynamic Class Creation
- 3. Invisible Metaclasses In Python
- 4. Metaclasses In Python
- 5. namespace['attr'] = 1
- 6. Logging Namespace
- 7. Meta Classes Without Type
- 8. More Accurate Meta Classes Without Type
- 9. Run Methods Order In Python
- 10. Run Methods Order In Python With More Explanation
- 11. Register Classes in Python
- 12. Singleton in Python
- 13. Modeling a Class with a Metaclass
- 14. Define Method If Condition True
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 kendisitype’ın bir örneğidir; yani Meta bir sınıftır, dolayısıyla tipitype.Example.__class__→<class '__main__.Meta'>— Example artıktypetarafından değilMetatarafından oluşturulmuştur; tipiMeta’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ğidirAnaloji
type → int ilişkisi ile Meta → Example ilişkisi özdeştir:
type,intsınıfını oluşturmak için kullanılır;int’in tipitype’tır.Meta,Examplesınıfını oluşturmak için kullanılır;Example’ın tipiMeta’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.
Hakan Çelik
