-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
================================================================================
🐍 SIFIRDAN İLERİ SEVİYEYE PYTHON EĞİTİM SERİSİ - BÖLÜM 3
================================================================================
Selamlar Değerli Forum Sakinleri! 🚀🔥
Serimizin ilk iki bölümünde bellek yönetimi, CPython mimarisi, bytecode
analizleri ve LEGB kapsam kurallarını geride bıraktık. Şimdi geldik nesne
yönelimli dünyanın görünmeyen yüzüne: **Bölüm 3!** ☕💻
Bu bölümde:
1. `__new__` ve `__init__` Arasındaki Hakiki Fark (Object Instantiation)
2. C3 Linearization ve MRO (Method Resolution Order) Algoritması
3. Metasınıflar (Metaclasses) ve `type` Gizemi
--------------------------------------------------------------------------------
1. Örnekleme (Instantiation) Sanatı: __new__ vs __init__ 🏗️
--------------------------------------------------------------------------------
Birçok yazılımcı bir sınıftan nesne üretildiğinde çalışan ilk metodun `__init__`
olduğunu sanır. Bu TEORİK OLARAK YANLIŞTIR!
`__new__`: Nesneyi BELLEKTE OLUŞTURAN (Constructor) static metottur.
`__init__`: Oluşturulmuş nesneyi BAŞLATAN (Initializer) instance metodudur.
Akış Şeması:
`Class()` ➔ `__new__(cls)` ➔ [Bellekte PyObject Oluşur] ➔ `__init__(self)`
Singleton (Tekil Nesne) Tasarım Deseni ile Teorik Kod Gösterimi:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
print(">>> Bellekte Yeni Nesne Tahsis Ediliyor (Heap Allocation)...")
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, veri):
print(">>> Nesne Değerleri İlklendiriliyor (Initialization)...")
self.veri = veri
obj1 = Singleton("İlk Veri")
obj2 = Singleton("İkinci Veri")
print(obj1 is obj2) # True! İkisi de bellekte BİREBİR AYNI adresi işaret eder!
--------------------------------------------------------------------------------
2. Çoklu Kalıtım ve C3 Linearization (MRO) 🏛️
--------------------------------------------------------------------------------
Python çoklu kalıtımı (Multiple Inheritance) destekler. Peki, karmaşık bir
kalıtım hiyerarşisinde aranan bir metodun hangi sınıftan çağrılacağına PVM
nasıl karar verir?
Burada **C3 Linearization** adı verilen deterministik bir sıralama algoritması
devreye girer. Sıralamayı `ClassName.__mro__` veya `ClassName.mro()` ile görebiliriz.
Elmas Problemi (Diamond Problem) Analizi:
class A:
def selam(self):
print("A Sınıfı")
class B(A):
def selam(self):
print("B Sınıfı")
class C(A):
def selam(self):
print("C Sınıfı")
class D(B, C):
pass
d = D()
d.selam() # Ekrana hangisi basılacak?
# MRO Sıralaması İncelemesi:
print(D.__mro__)
# Çıktı: (D, B, C, A, object)
# C3 Algoritmasına göre arama sırası D -> B -> C -> A -> object şeklindedir.
# Dolayısıyla ekrana "B Sınıfı" basılır!
--------------------------------------------------------------------------------
3. Sınıfları Oluşturan Sınıflar: Metasınıflar (Metaclasses) 🔮
--------------------------------------------------------------------------------
Python'da "Her şey bir nesnedir" demiştik. Sınıflar da birer nesnedir!
Peki bir sınıfın türü (type) nedir?
a = 5
print(type(a)) # <class 'int'>
class Test:
pass
print(type(Test)) # <class 'type'> !
İşte Python'daki tüm sınıfları üreten varsayılan metasınıf **`type`**'tır.
Dinamik olarak bir sınıf oluşturmak için `type` doğrudan kullanılabilir:
# type(sınıf_adı, kalıtım_alınanlar, sınıf_sözlüğü)
DinamikSinif = type("DinamikSinif", (), {"x": 100, "yaz": lambda self: print("Çalıştı!")})
obj = DinamikSinif()
print(obj.x) # 100
obj.yaz() # Çalıştı!
Özel Metasınıf (Custom Metaclass) ile Sınıf Mimarisi Denetleme:
Yazdığımız sınıfların kurallara uyup uymadığını (örn: tüm metodların büyük harfle
başlayıp başlamadığını) henüz SINIF TAHSİS EDİLİRKEN denetleyebiliriz:
class StrictMeta(type):
def __new__(cls, name, bases, dct):
for attr_name in dct:
if not attr_name.startswith("__") and not attr_name.isupper():
raise TypeError(f"Kural İhlali: '{attr_name}' metodu BÜYÜK HARFLE yazılmalı!")
return super().__new__(cls, name, bases, dct)
# Bu sınıf derlenirken hata verecektir:
# class HatalıSinif(metaclass=StrictMeta):
# def test_metodu(self): pass # TypeError Fırlatır!
--------------------------------------------------------------------------------
4. Bölüm Özeti ve Gelecek Adım 📌
--------------------------------------------------------------------------------
Bu bölümde Nesne Yönelimli Programlama'nın (OOP) arka planında yatan `__new__`
mimarisi, MRO algoritması ve Metasınıflar ile dinamik sınıf üretimini inceledik.
Devam etmek için forum başlığı altına "DEVAM" yazmanız yeterlidir!
Bir sonraki bölümde (Bölüm 4):
- Python Decorator (Bezeyici) Mimarisi ve Closure (Kapanış) Mantığı
- Generator, İteratör Mimarisi ve `yield` Protokolü
- Memory-efficient Veri İşleme (Lazy Evaluation)
Sorularınızı ve teorik
katkılarınızı aşağıda bekliyorum! 🚀✨
================================================================================
🐍 SIFIRDAN İLERİ SEVİYEYE PYTHON EĞİTİM SERİSİ - BÖLÜM 3
================================================================================
Selamlar Değerli Forum Sakinleri! 🚀🔥
Serimizin ilk iki bölümünde bellek yönetimi, CPython mimarisi, bytecode
analizleri ve LEGB kapsam kurallarını geride bıraktık. Şimdi geldik nesne
yönelimli dünyanın görünmeyen yüzüne: **Bölüm 3!** ☕💻
Bu bölümde:
1. `__new__` ve `__init__` Arasındaki Hakiki Fark (Object Instantiation)
2. C3 Linearization ve MRO (Method Resolution Order) Algoritması
3. Metasınıflar (Metaclasses) ve `type` Gizemi
--------------------------------------------------------------------------------
1. Örnekleme (Instantiation) Sanatı: __new__ vs __init__ 🏗️
--------------------------------------------------------------------------------
Birçok yazılımcı bir sınıftan nesne üretildiğinde çalışan ilk metodun `__init__`
olduğunu sanır. Bu TEORİK OLARAK YANLIŞTIR!
`__new__`: Nesneyi BELLEKTE OLUŞTURAN (Constructor) static metottur.
`__init__`: Oluşturulmuş nesneyi BAŞLATAN (Initializer) instance metodudur.
Akış Şeması:
`Class()` ➔ `__new__(cls)` ➔ [Bellekte PyObject Oluşur] ➔ `__init__(self)`
Singleton (Tekil Nesne) Tasarım Deseni ile Teorik Kod Gösterimi:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
print(">>> Bellekte Yeni Nesne Tahsis Ediliyor (Heap Allocation)...")
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, veri):
print(">>> Nesne Değerleri İlklendiriliyor (Initialization)...")
self.veri = veri
obj1 = Singleton("İlk Veri")
obj2 = Singleton("İkinci Veri")
print(obj1 is obj2) # True! İkisi de bellekte BİREBİR AYNI adresi işaret eder!
--------------------------------------------------------------------------------
2. Çoklu Kalıtım ve C3 Linearization (MRO) 🏛️
--------------------------------------------------------------------------------
Python çoklu kalıtımı (Multiple Inheritance) destekler. Peki, karmaşık bir
kalıtım hiyerarşisinde aranan bir metodun hangi sınıftan çağrılacağına PVM
nasıl karar verir?
Burada **C3 Linearization** adı verilen deterministik bir sıralama algoritması
devreye girer. Sıralamayı `ClassName.__mro__` veya `ClassName.mro()` ile görebiliriz.
Elmas Problemi (Diamond Problem) Analizi:
class A:
def selam(self):
print("A Sınıfı")
class B(A):
def selam(self):
print("B Sınıfı")
class C(A):
def selam(self):
print("C Sınıfı")
class D(B, C):
pass
d = D()
d.selam() # Ekrana hangisi basılacak?
# MRO Sıralaması İncelemesi:
print(D.__mro__)
# Çıktı: (D, B, C, A, object)
# C3 Algoritmasına göre arama sırası D -> B -> C -> A -> object şeklindedir.
# Dolayısıyla ekrana "B Sınıfı" basılır!
--------------------------------------------------------------------------------
3. Sınıfları Oluşturan Sınıflar: Metasınıflar (Metaclasses) 🔮
--------------------------------------------------------------------------------
Python'da "Her şey bir nesnedir" demiştik. Sınıflar da birer nesnedir!
Peki bir sınıfın türü (type) nedir?
a = 5
print(type(a)) # <class 'int'>
class Test:
pass
print(type(Test)) # <class 'type'> !
İşte Python'daki tüm sınıfları üreten varsayılan metasınıf **`type`**'tır.
Dinamik olarak bir sınıf oluşturmak için `type` doğrudan kullanılabilir:
# type(sınıf_adı, kalıtım_alınanlar, sınıf_sözlüğü)
DinamikSinif = type("DinamikSinif", (), {"x": 100, "yaz": lambda self: print("Çalıştı!")})
obj = DinamikSinif()
print(obj.x) # 100
obj.yaz() # Çalıştı!
Özel Metasınıf (Custom Metaclass) ile Sınıf Mimarisi Denetleme:
Yazdığımız sınıfların kurallara uyup uymadığını (örn: tüm metodların büyük harfle
başlayıp başlamadığını) henüz SINIF TAHSİS EDİLİRKEN denetleyebiliriz:
class StrictMeta(type):
def __new__(cls, name, bases, dct):
for attr_name in dct:
if not attr_name.startswith("__") and not attr_name.isupper():
raise TypeError(f"Kural İhlali: '{attr_name}' metodu BÜYÜK HARFLE yazılmalı!")
return super().__new__(cls, name, bases, dct)
# Bu sınıf derlenirken hata verecektir:
# class HatalıSinif(metaclass=StrictMeta):
# def test_metodu(self): pass # TypeError Fırlatır!
--------------------------------------------------------------------------------
4. Bölüm Özeti ve Gelecek Adım 📌
--------------------------------------------------------------------------------
Bu bölümde Nesne Yönelimli Programlama'nın (OOP) arka planında yatan `__new__`
mimarisi, MRO algoritması ve Metasınıflar ile dinamik sınıf üretimini inceledik.
Devam etmek için forum başlığı altına "DEVAM" yazmanız yeterlidir!
Bir sonraki bölümde (Bölüm 4):
- Python Decorator (Bezeyici) Mimarisi ve Closure (Kapanış) Mantığı
- Generator, İteratör Mimarisi ve `yield` Protokolü
- Memory-efficient Veri İşleme (Lazy Evaluation)
Sorularınızı ve teorik
katkılarınızı aşağıda bekliyorum! 🚀✨
================================================================================
🔒 Bu içeriği görmek için giriş yapın