Invisible 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
Invisible Metaclasses In Python
Python’da her sınıfın bir metaclass’ı vardır. Bunu açıkça belirtmezseniz Python, varsayılan olarak type metaclass’ını kullanır. Yani aşağıdaki iki sınıf tanımı tamamen aynı anlama gelir:
class K(metaclass=type):
pass
class Example(K, metaclass=type):
passYukarıdaki kodda metaclass=type açıkça yazılmıştır. Ancak bunu yazmadan da aynı sonucu elde edersiniz:
class K:
pass
class Example(K):
passPeki Bu Ne Anlama Gelir?
type, Python’da metaclass hiyerarşisinin en tepesinde yer alır. Bir sınıf tanımladığınızda Python sahne arkasında şunları yapar:
>>> type(K)
<class 'type'>
>>> type(Example)
<class 'type'>Her iki yaklaşımda da sınıfın type’ı type’tır; çünkü metaclass belirtilmediğinde Python otomatik olarak type’ı devreye sokar. İşte “görünmez metaclass” davranışı budur — siz görmezsiniz, ama her zaman oradadır.
Miras ve Metaclass
Bir sınıf miras aldığında parent sınıfın metaclass’ı da devralınır. Example(K) örneğinde K’nın metaclass’ı type olduğu için Example’ın metaclass’ı da type olur. Özel bir metaclass tanımladığınızda bu davranış değişir:
class Meta(type):
pass
class K(metaclass=Meta):
pass
class Example(K): # Meta devralınır, type değil
pass
>>> type(Example)
<class '__main__.Meta'>Neden Önemli?
type metaclass’ı çoğu durumda görünmez kalır; ancak kendi metaclass’ınızı yazarken veya bir kütüphanenin metaclass’ını incelerken bu varsayılan davranışı anlamak kritik öneme sahiptir. Metaclass belirtilmemesi “metaclass yok” anlamına gelmez; sadece type sessizce işini yapar.
Hakan Çelik

