Menu

Python Sınıfları: __init__, self, Metotlar, Kalıtım ve Dataclass

Python sınıflarına yeni başlayanlar için bir giriş — tanımlama, örnek oluşturma, __init__ metodu, kalıtım ve ne zaman yerine dataclass kullanılacağı.

Sınıf, Veri ile Ona Yapılacak Şeyi Bir Arada Toplar

Bir sınıf sayesinde bir tür şey tanımlarsın — bir kullanıcı, bir banka hesabı, bir yapılandırma, bir istek — ve o şeyin yapabilmesi gereken her şey. Şey, sınıfın bir örneğidir. Eylemler, metotlar olarak adlandırılır.

İşte mümkün olan en basit sınıf:

main.py
Output
Click Run to see the output here.

Parçalarına ayıralım:

  • class User: bir sınıf tanımını başlatır. Sınıf adları, gelenek gereği PascalCase kullanır.
  • __init__, başlatıcıdır. Yeni bir örnek oluşturduğunda otomatik çalışır. Örneğin özniteliklerini self.whatever = ... ile ayarlar.
  • greet, bir metottur. self, metodun üzerinde çağrıldığı örneğe başvuru biçimidir.
  • User("Rosa", "rosa@example.com") bir örnek oluşturur. Python, __init__'i self yeni örneğe ayarlı ve diğer argümanlar geçirilmiş olarak çağırır.
  • user.greet() metodu çağırır. Python userself olarak otomatik geçirir.

self Sadece İlk Argümandır

self bir anahtar kelime değildir. Python'un örnek metotlarının ilk parametresine verdiği isimdir — metodun üzerinde çalıştığı örnek. İstediğini yazabilirsin; herkes self kullanır çünkü herkes kullanır.

Her örnek metodu ilk parametre olarak self alır. Bir metodun hangi örnekten okuyacağını ya da değiştireceğini bu sayede bilir.

Davranış Eklemek

Metotlar durumu okuyabilir ve değiştirebilir:

main.py
Output
Click Run to see the output here.

__repr__, başka bir özel metottur — "bu nesneyi yazdırırken nasıl göstereyim?" kancası. İyisini tanımlamak, hata ayıklama sırasında temettüsünü ödetir.

Sınıf Öznitelikleri vs Örnek Öznitelikleri

Sınıf gövdesinde (__init__ dışında) tanımlanan öznitelikler, tüm örnekler arasında paylaşılır. self'e atanan öznitelikler ise örnek başınadır:

main.py
Output
Click Run to see the output here.

Gerçekten paylaşılan değerler — sabitler, sayaçlar, yapılandırma — için sınıf özniteliklerini kullan. Örneğe özel veriyi __init__ içine koy.

Kalıtım

Bir sınıf başka bir sınıftan kalıt alabilir; onun metotlarını ve özniteliklerini ücretsiz alır, ihtiyaca göre ekler ya da ezer:

main.py
Output
Click Run to see the output here.

super() sana üst sınıfa erişim verir — __init__ içinde kendi özniteliklerini eklemeden önce üstün özniteliklerini başlatmak için yaygın olarak kullanılır:

main.py
Output
Click Run to see the output here.

Kalıtım kullanışlıdır ama kolayca abartılır. Yeni bir Python programcısı, kompozisyon — bir nesneyi öznitelik olarak tutmak — daha net olurken sık sık kalıtıma uzanır. Düz bir sınıf yapısıyla başla ve yalnızca gerçek bir "şu-bir-bu" ilişkin olduğunda kalıtımı devreye sok.

Dataclass: Kayıtlar İçin Daha Hoş Bir Varsayılan

Genellikle bir sınıfın eşitlik ve gösterim davranışıyla birkaç özniteliği tutmasını istediğinde @dataclass bir sürü boilerplate'ten kurtarır:

main.py
Output
Click Run to see the output here.

Bunu elle __init__, __repr__ ve __eq__ yazmakla karşılaştır. Aksi halde class Thing yazıp yalnızca __init__'te öznitelik ayarlayacağın zamanlar için dataclass doğru ilk seçimdir.

Property: Hesaplanan Öznitelikler

Bazen aslında hesaplanan bir "öznitelik" istersin. @property bunu öznitelik erişimi gibi gösterir:

main.py
Output
Click Run to see the output here.

obj.get_something() yazacağın yerde property kullan — onunla değiştirmek API'yi daha doğal hissettirir. Pahalı işlemleri gizlemek için kullanma; kullanıcı öznitelik erişiminin hızlı olmasını bekler.

Gelenek Gereği Özel

Python'da gerçek bir private yoktur. Gelenek gereği, başında alt çizgi olan öznitelikler niyetli olarak özeldir — okuyucuların onlara sınıf dışından dokunmaması beklenir:

class Cache:
    def __init__(self):
        self._store = {}

    def put(self, key, value):
        self._store[key] = value

    def get(self, key, default=None):
        return self._store.get(key, default)

Çift alt çizgi ile başlayan isimler (__name) isim karıştırmayı tetikler; bu, sınıfın adını özniteliğe ekler. Kalıtımdaki çakışmaları önlemek için bir araçtır, güvenlik önlemi değil.

Sınıf Kullanmaman Gereken Yerler

Elinde yalnızca ilişkili verilerin bir demeti varsa, dataclass, düz bir dict ya da isimli bir tuple işini görür. Elinde yalnızca bir fonksiyon varsa, onu tutmak için bir sınıfa ihtiyacın yoktur. Durum ve davranış birlikte bağlıysa — özellikle aynı türden çok sayıda örneğin olacaksa — sınıfa uzan.

Son Bir Örnek

Küçük bir dosya benzeri log tamponu:

main.py
Output
Click Run to see the output here.

__len__'a dikkat — başka bir sihirli metot. Onu tanımlamak len(logger)'ı çalıştırır çünkü len(x) aslında x.__len__() çağrısıdır. Python'un bu kancalardan düzinelerce var; ihtiyaç duydukça öğreneceksin.

Sırada: Generator'lar

Sınıflar veriyi ve davranışı bir araya bağlar. Bir sonraki bölüm farklı bir soyutlamaya bakıyor — iterasyon — generator'larla başlayarak: değerleri teker teker üreten, aralarında duraklayan fonksiyonlar. Hemen ardından karşılaşacağın with deyimi / context manager'larla çok güzel uyum sağlarlar.

Sıkça Sorulan Sorular

Python'da sınıf nedir?

Sınıf, veriyi (öznitelikler) ve davranışı (metotlar) bir arada paketleyen nesneler oluşturmak için bir şablondur. class User: bir User sınıfı tanımlar; User(...) bir örnek oluşturur. Sınıflar, hem durum hem de davranış taşıyan şeyleri modellemek için Python'un ana aracıdır.

Python'da self ne anlama gelir?

self, her örnek metodunun ilk parametresidir. user.greet() çağırdığında Python user örneğini self olarak geçirir. Metot içinde self.name, o kullanıcının name özniteliğine erişir. self adı bir anahtar kelime değil, bir gelenektir — ama her Pythonista'nın kullandığı gelenektir.

Python nesne yönelimli mi?

Evet — Python'daki her şey bir nesnedir; sayılar, string'ler ve fonksiyonlar dahil. Uyduğu yerde nesne yönelimli programlama yapabilirsin ama Python seni buna zorlamaz. Pek çok gerçek dünya Python programı sınıfları az kullanır; mümkün olduğunda düz fonksiyonları ve veri yapılarını tercih eder.

Coddy ile kodlamayı öğren

BAŞLA