Ana içeriğe atla

Python Dunder Yöntemleri: Bilinmeye Değer Özel Komutlar

Python’un çift alt çizgi yöntemlerinin özel nesnelerinizin yazdırmadan aritmetiğe kadar yerleşik işlemlerle doğal biçimde çalışmasını nasıl sağladığını öğrenin. Bu sihirli yöntemlerin sınıf tasarımını nasıl basitleştirdiğini ve güçlü davranışların kilidini nasıl açtığını keşfedin.
Güncel 3 Eki 2026  · 8 dk. oku

Yapay Zeka ile Keşfedin

ChatGPTClaudePerplexity

Özel sınıflarınızın Python'daki yerleşik işlevlerle sorunsuz çalışmasını Python nasıl sağlıyor diye hiç merak ettiniz mi? Bunun nedeni o kullanışlı “dunder” yöntemleri—çift alt çizgi (double underscore) yöntemlerinin kısaltmasıdır.

Karmaşık sayılar için bir sınıf oluşturduğunuzu ve + operatörünü doğal bir şekilde kullanmak istediğinizi hayal edin. Toplamayı elle yönetmek için fazladan kod yazmak yerine bir __add__ yöntemi tanımlarsınız ve gerisini Python halleder.

__init__ nesne yaratımı ve __str__ string temsili gibi bu sihirli yöntemler Python tarafından otomatik olarak çağrılır; yani onları doğrudan sizin çağırmanız gerekmez. Düzenli yöntemlerinizle ad çakışmalarını önler ve operatör aşırı yükleme ile özel davranışlar gibi özelliklere güç verirler.

İster nesne başlatıyor, ister aritmetik işlemler yapıyor, ister yalnızca bir nesneyi yazdırıyor olun, dunder yöntemleri arka planda sessizce çalışarak kodunuzu daha zarif ve verimli hale getirir. Python'a yeniyseniz ve temel fikirleri hızlıca gözden geçirmek istiyorsanız, sağlam bir temel için Introduction to Python kursumuzu alın.

Python'da Dunder Yöntemleri Nedir?

Belirtmeye başladığım gibi, Python dunder yöntemleri, özel sınıflarınızın Python'un yerleşik işlemleriyle bütünleşmesini sağlayarak Python'un veri modelinin belkemiğini oluşturan benzersiz, ya da “sihirli,” yöntemlerdir. Bu işlemler arasında yazdırma, karşılaştırma ve aritmetik gerçekleştirme gibi şeyler bulunur.

Nesneleri başlatmak için __init__, nesne temsili için __repr__ ve __str__ ya da temizlik için __del__ gibi yöntemler tanımladığınızda, özünde Python'a nesneleriniz için standart işlemleri nasıl ele alacağını söylersiniz. Karşılık gelen işlem gerçekleştirildiğinde yorumlayıcı bu yöntemleri otomatik olarak çağırır. Bu yerleşik otomasyon, yerel Python özellikleri ile kullanıcı tanımlı sınıflar arasında bir köprü oluşturur.

İleride, bu yöntemleri kullanan ve kullanmayan sınıf örneklerine bakacağız ki tüm bunların nasıl çalıştığını görebilin.

Dunder Yöntemlerinin Kategorileri

Dunder yöntemlerinin ana kategorilerini keşfedelim ve kodunuzu nasıl güçlendirdiklerine bakalım.

1. Başlatma ve oluşturma

__new__, __init__ ve __del__ gibi dunder yöntemleri, nesnelerin nasıl oluşturulduğunu, başlatıldığını ve nihayetinde yok edildiğini kontrol eder.

  • __new__ ve __init__: __new__ yeni bir örneği oluşturmakla sorumluyken, __init__ onu başlatır. Bu ayrım, değişmez (immutable) türlerle çalışırken önemlidir; bu durumda __new__ yöntemini başka amaçlarla geçersiz kılabilirsiniz.

  • __del__: Bu yöntem bir yıkıcı (destructor) gibi davranır ve bir nesne çöp toplayıcı tarafından alınmak üzereyken temizlik yapılmasına izin verir.

Hatta değişmez sınıflarda __new__ yöntemini özelleştirerek belirli oluşturma kurallarını zorunlu kılabilirsiniz.

2. Sayısal ve aritmetik yöntemler

__add__, __sub__, __mul__ ve bunların yerinde (in-place) varyantları gibi dunder yöntemleri, nesnelerinizin aritmetik işlemleri desteklemesini sağlar. Buna operatör aşırı yükleme denir. Bu yöntemleri tanımlayarak, özel nesneleriniz için doğal aritmetik davranışı etkinleştirebilirsiniz.

Örneğin, bir Vector sınıfında __add__ yöntemini aşırı yükleyerek iki vektörün karşılık gelen elemanlarını toplayabilirsiniz. Bu, matematiksel kavramları veya finansal araçları modelleyen sınıflar tasarlarken özellikle kullanışlıdır.

3. Karşılaştırma ve eşitlik yöntemleri

__eq__, __lt__ ve __gt__ gibi yöntemler, nesnelerin nasıl karşılaştırıldığını belirler. Bu yöntemler, iki nesnenin ne zaman eşit sayılacağını veya nasıl sıralanacağını tanımlamanıza olanak tanır.

Tipik bir örnek, iki şeklin alanlarını karşılaştırmaktır: Bir şeklin alanı diğerinden küçükse __lt__ yöntemini true dönecek şekilde geçersiz kılabilirsiniz. Bu, koleksiyonlarda veya sıralama algoritmalarında yardımcı olabilir.

4. Dize (string) temsil yöntemleri

__str__ ve __repr__ yöntemleri, nesnelerinizin dizeler olarak nasıl görüntüleneceğini kontrol eder.

  • __repr__, nesneyi yeniden oluşturmak için kullanılabilecek, geliştirici dostu bir temsil sunmalıdır.

  • __str__ kullanıcı dostu bir görünüme odaklanır.

5. Kap ve yineleyici yöntemleri

Nesnelerinizin bir dizi veya kap gibi davranmasını sağlamak için __len__, __getitem__ ve __iter__ gibi yöntemleri uygulayabilirsiniz. Bu, indeksleme, yineleme ve üyelik testleri gibi işlemleri etkinleştirir.

Örneğin, özel bir yığın (stack) veya liste tasarlarsanız, bu yöntemleri uygulamak len() gibi yerleşik işlevleri kullanabilmenizi sağlar.

6. Çağrılabilirlik ve fonksiyonel programlama

__call__ yöntemiyle sınıfınızın örnekleri işlev gibi çağrılabilir. Bu, sonuçları önbelleğe alabilen veya çağrılar arasında dahili durumu koruyabilen durumlu işlev nesneleri oluşturmak için özellikle kullanışlıdır. Bunu, farklı parametrelerle defalarca çağırabileceğiniz küçük bir hesaplama motoruna dönüştürmek gibi düşünebilirsiniz.

7. Bağlam yöneticileri

__enter__ ve __exit__ yöntemlerini uygulamak, nesnelerinizin kaynak yönetimi için with deyimiyle kullanılmasına olanak tanır. Bu, dosya tanıtıcıları veya ağ bağlantıları gibi kaynakların yönetimi için kritik öneme sahiptir; doğru şekilde kurulup temizlenmelerini sağlar.

Gerçek bir senaryo olarak, veritabanı bağlantılarını güvenle açıp kapatmak için özel bir bağlam yöneticisi kullanmak verilebilir.

8. Öznitelik erişimi ve tanımlayıcılar

__getattr__, __setattr__ ve __delattr__ gibi yöntemler, özniteliklere nasıl erişildiğini ve nasıl değiştirildiğini kontrol etmenizi sağlar. Tanımlayıcı protokolü, öznitelik erişiminin dinamik olarak yönetilmesine olanak tanıyarak bunu daha da inceltir.

Örneğin, bir tanımlayıcı öznitelik değerlerini doğrulayabilir veya dönüştürebilir; böylece atanmeden önce belirli ölçütleri karşılamalarını sağlar.

İleri ve Çeşitli Dunder Yöntemleri  

Çekirdek dunder yöntemleri çoğu kullanım durumunu kapsarken, Python eşzamanlı olmayan programlama, metaprogramlama ve kütüphaneye özgü davranışlar gibi görevler için gelişmiş ve uzmanlaşmış yöntemler içerir. Örneğin:  

  • Eşzamanlı olmayan yöntemler: __aiter__ ve __anext__ gibi yöntemler eşzamanlı olmayan yinelemeyi etkinleştirir; __await__ ise beklenebilir (awaitable) nesneleri destekler.  

  • Metaprogramlama kancaları: __prepare__ ve __set_name__ gibi yöntemler dinamik sınıf oluşturma ve öznitelik adlandırmaya olanak tanır.  

  • Kütüphaneye özgü yöntemler: NumPy veya Pandas gibi kütüphaneler sıklıkla özel dunder yöntemleri tanımlar (ör. NumPy entegrasyonu için __array__).

Bu gelişmiş yöntemler genellikle özelleşmiş görevler için kullanılır; bu nedenle çoğu geliştiricinin günlük olarak ihtiyaç duyması beklenmez. Ancak Python'un esnekliğini ve derinliğini sergilerler. Tam liste için resmi Python veri modeli belgelerini incelemenizi öneririm. Bu kaynak, tüm dunder yöntemleri ve amaçlanan kullanımları hakkında kapsamlı ayrıntılar sunar.

Python'daki Tüm Dunder Yöntemleri

Python, her biri nesne davranışının farklı yönlerini kontrol edecek şekilde tasarlanmış 100'ün üzerinde dunder yöntemi sunar. Bu yazıda temel kategorileri ele almış olsak da, hızlı başvuru olarak üst düzey bir özet aşağıdadır:

  • Aritmetik yöntemler: __add__, __sub__, __mul__ ve __truediv__ gibi yöntemler, nesnelerinizin (+, -, *, /) operatörlerini desteklemesini sağlar.

  • Karşılaştırma yöntemleri: __eq__, __lt__ ve __gt__ gibi yöntemler, nesnelerin eşitlik veya sıralama açısından nasıl karşılaştırılacağını tanımlar.

  • Öznitelik yönetimi: __getattr__, __setattr__ ve __delattr__ gibi yöntemlerle öznitelik erişimini kontrol edebilir ve dinamik davranışlar uygulayabilirsiniz.

  • Başlatma ve oluşturma: __new__, __init__ ve __del__ sırasıyla nesne oluşturma, başlatma ve temizlemeyi yönetir.

  • Dize temsili: __str__ ve __repr__ gibi yöntemler, nesnelerin dizeler olarak nasıl temsil edileceğini belirler; kullanıcı dostu çıktıya yardımcı olur.

  • Yineleme ve kap davranışı: Nesnelerinizi yinelenebilir yapmak için __iter__ ve __next__ uygulayın ve indeksleme ile uzunluk alma desteği için diğer yöntemleri ekleyin.

  • Çağrılabilirlik: __call__, bir örneğin işlev gibi çağrılmasına olanak tanır; durumlu davranışla fonksiyonel bir programlama stilini mümkün kılar.

  • Bağlam yönetimi: __enter__ ve __exit__ ile nesneler, kaynakları doğru şekilde yönetmek için with deyimleriyle kullanılabilir.

  • Metaprogramlama kancaları: __init_subclass__ gibi yöntemler, sınıf oluşturmayı ve davranışını dinamik olarak özelleştirme yolları sunar.

Bu dunder yöntemlerinin ve işlevlerinin eksiksiz, ayrıntılı listesi için resmi Python Veri Modeli belgelerine başvurun. Bu kapsamlı kaynak, Python'un nesne modelinin tüm gücünü açığa çıkarmanıza ve daha zarif, verimli kod yazmanıza yardımcı olacaktır.

Gerçek Dünya Örnekleri ve Kullanım Alanları

Birkaç örnek üzerinden dunder yöntemlerinin gerçek dünya senaryolarını nasıl güçlendirebileceğini inceleyelim.

Operatör aşırı yükleme

Özel bir sayısal veya dize sınıfınız olduğunu hayal edin. __add__ veya __mul__ gibi dunder yöntemlerini uygulayarak nesnelerinizin aritmetik operatörlerle doğal şekilde çalışmasını sağlarsınız. Tıpkı yerleşik türlerde olduğu gibi örnekleri toplayabilir, çıkarabilir veya çarpabilirsiniz; böylece özel sınıflarınız Python'un aritmetik işlemleriyle kusursuz biçimde uyum sağlar.

class Vector:
   def __init__(self, x, y):
        self.x = x
        self.y = y
   def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
   def __str__(self):
        return f"Vector({self.x}, {self.y})"

# Usage
v1 = Vector(1, 2)
v2 = Vector(3, 4)

result = v1 + v2
print(result)  # Output: Vector(4, 6)

Çağrılabilirlikle önbellekleme

Maliyetli hesaplamaları tekrarlamaktan kaçınmak istediniz mi? __call__ yöntemini uygulayarak bir nesneyi sonuçlarını önbelleğe alan bir işlev gibi davranır hale getirebilirsiniz. Bu, ağır bir hesaplamanın sonucunu saklamanıza ve sonraki çağrılarda hızla döndürmenize olanak tanıyarak performansı optimize eder ve değerli işlem süresinden tasarruf sağlar.

class CachedComputation:
   def __init__(self):
        self.cache = {}
   def __call__(self, x):
        if x not in self.cache:
            self.cache[x] = self._expensive_computation(x)
        return self.cache[x]
   def _expensive_computation(self, x):
        # Imagine a complex calculation here
        return x ** 2

# Usage
compute = CachedComputation()

print(compute(5))  # Computes and caches: Output: 25
print(compute(5))  # Retrieves from cache: Output: 25

Özel bağlam yöneticileri

__enter__ ve __exit__ yöntemlerini kullanarak bir bağlam yöneticisi oluşturmak, kaynak yönetimini otomatikleştirmenize olanak tanır. Örneğin, bir dosya bloğa girildiğinde açılıp çıkıldığında kapatılacak şekilde dosya işlemlerini yöneten özel bir bağlam yöneticisi tasarlayabilirsiniz. Bu, kodunuzu basitleştirir ve kaynak sızıntıları gibi yaygın hataları önler.

class FileHandler:
   def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
   def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file
   def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

# Usage
with FileHandler("example.txt", "r") as file:
    content = file.read()
    print(content)

Özel yinelenebilirler ve kaplar

Özel kaplarınızın Python'un döngüleri ve anlama (comprehension) yapılarıyla çalışmasını sağlamak için, __iter__ ve __next__ gibi yöntemleri tanımlayarak yineleme protokolünü uygulayın. İster özel bir yığın, kuyruk ister başka bir kap inşa ediyor olun, bu yöntemler nesnelerinizin normal bir liste gibi döngüye sokulmasını sağlar; sınıflarınızın esnekliğini ve kullanılabilirliğini artırır.

class Stack:
   def __init__(self):
        self.items = []
   def push(self, item):
	self.items.append(item)
   def pop(self):
        return self.items.pop()
   def __iter__(self):
        self.index = 0
        return self
   def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        item = self.items[self.index]
        self.index += 1
        return item

# Usage
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)

for item in stack:
    print(item)  # Output: 1, 2, 3

Özel yinelenebilirler ve kap davranışı hakkında daha fazlası için Python Lists Tutorial ve Python List Functions & Methods Tutorial and Examples içeriklerine göz atın.

Dunder Yöntemlerinde En İyi Uygulamalar

Dunder yöntemlerinin ne zaman ve nasıl geçersiz kılınacağı önemlidir. Aklınızda tutmanız gereken bazı yönergeler:

Ne zaman geçersiz kılınır

Yalnızca davranışı özelleştirmeniz gerekiyorsa dunder yöntemlerini geçersiz kılın. Örneğin, nesnelerinizin aritmetik veya eşitlik kontrollerini belirli bir şekilde desteklemesini istiyorsanız __add__ veya __eq__ gibi yöntemleri uygulamak değerlidir.

Tutarlılık

Eşitlik kontrolleri için __eq__ gibi bir yöntemi geçersiz kılarsanız, ilgili __hash__ gibi yöntemleri de buna uygun şekilde güncelleyin. Bu tutarlılık, nesnelerinizin kümeler veya sözlükler gibi koleksiyonlarda doğru davranmasını sağlar.

Aşırı kullanımdan kaçının

Standart Python veri modeli dışında yeni dunder adları yaratma dürtüsüne karşı koyun. Yerleşik dunder yöntemi setine bağlı kalmak kodunuzu net tutar ve beklenmeyen davranışları önler.

Performans dikkate alın

Özellikle kodunuzun sıkça çalışan bölümlerinde dunder yöntemlerini aşırı ölçüde geçersiz kılmanın performansı etkileyebileceğini unutmayın. Yüksek frekanslı işlemlerde yavaşlamaları önlemek için verimli uygulamalar hedefleyin.

Sonuç ve Ek Kaynaklar

Dunder yöntemleri, Python sınıflarınızın dilin yerleşik özellikleriyle sorunsuz etkileşime girmesini sağlayarak kodunuzu daha temiz ve sezgisel hale getirir. Nesnelerinizin aritmetikten karşılaştırmalara, özel öznitelik yönetimine kadar her şeyi sizin ekstra çabanız olmadan ele almasını sağlarlar. Bu yöntemlerle projelerinizde denemeler yapmalı ve karmaşık işlemleri nasıl basitleştirebildiklerini görmelisiniz.

Daha derinlemesine bilgi için resmi Python veri modeli belgelerine göz atın. Ayrıca şu DataCamp kaynaklarımızı da faydalı bulacaksınız:


Oluseye Jeremiah's photo
Author
Oluseye Jeremiah
LinkedIn

Yapay zekâ, makine öğrenimi ve veri bilimi alanlarında uzmanlaşmış teknik yazar; karmaşık fikirleri anlaşılır ve erişilebilir kılar.

Konular
Python

DataCamp ile Python Öğrenin

Kurs

Orta Seviye Python

4 sa
1.4M
Matplotlib kullanarak görselleştirmeler oluşturarak ve pandas ile DataFrames'i manipüle ederek veri bilimi becerilerinizi geliştirin.
Ayrıntıları GörüntüleRight Arrow
Kursa Başla
Devamını GörRight Arrow
İlgili

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Dario Radečić's photo

Dario Radečić

15 dk.

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Kurtis Pykes 's photo

Kurtis Pykes

8 dk.

Devamını GörDevamını Gör