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:
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 öznitelikleriniself.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__'iselfyeni örneğe ayarlı ve diğer argümanlar geçirilmiş olarak çağırır.user.greet()metodu çağırır. Pythonuser'ıselfolarak 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:
__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:
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:
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:
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:
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:
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:
__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.