🐍 SIFIRDAN İLERİ SEVİYEYE PYTHON EĞİTİM SERİSİ - BÖLÜM 3

================================================================================
🐍 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

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,050Konular
3,297,711Mesajlar
326,237Kullanıcılar
thekral21Son Üye
Üst Alt