Python'da sınıf nasıl yazılır? class ile benzer nesnelerin ortak özelliklerini ve davranışlarını tanımlarsın. __init__ metodu, nesne oluşturulurken başlangıç değerlerini ayarlar; sınıfı çağırdığında ise kullanılabilir bir nesne üretilir.
Python'da sınıf, __init__ ve nesne ne anlama gelir?
Sınıf, aynı türdeki bilgileri ve işlemleri bir arada tutan bir şablondur. Örneğin görev takip uygulamasında Gorev sınıfı, her görevin başlığını, tamamlanma durumunu ve görevi tamamlama işlemini tanımlayabilir. Bu tanım, henüz belirli bir görevin kendisi değildir.
“Sınıf şablondur, nesne bu şablona göre oluşturulmuş kullanılabilir örnektir.”
Nesne, sınıfın somut örneğidir. Gorev sınıfından oluşturulan “matematik ödevini bitir” görevi bir nesne olabilir. Bu nesnenin baslik ve tamamlandi gibi özellikleri vardır. Görevi tamamlandı olarak işaretlemek gibi yaptığı işlemler ise metot olarak adlandırılır.
__init__ metodu bazen nesneyi oluşturan yapı gibi düşünülür, ancak görevi doğrudan nesne üretmek değildir. Nesneyi sınıf çağrısı üretir; __init__ ise üretilen nesnenin ilk durumunu hazırlar. Örneğin yeni bir görev oluşturulduğunda başlığı atanabilir ve tamamlanma durumu başlangıçta False yapılabilir.
class, self ve __init__ sözdizimi nasıl çalışır?

Bir sınıf tanımı class Gorev: biçiminde başlar. Sınıfın içindeki metotlar def ile yazılır. Nesne oluşturulurken çalışan başlangıç metodu genellikle def __init__(self, baslik): şeklindedir. Buradaki __init__ adında, hem başta hem sonda ikişer alt çizgi bulunur; eksik ya da farklı yazılırsa Python bunu başlangıç metodu olarak çalıştırmaz.
self, işlem yapılan mevcut nesneye erişmeyi sağlar. Örneğin self.baslik = baslik ifadesinde soldaki self.baslik, nesnenin kendi başlık özelliğidir; sağdaki baslik ise metoda verilen değerdir. Böylece her görev nesnesi kendi başlığını ve kendi tamamlanma durumunu ayrı ayrı saklayabilir.
self özel bir anahtar sözcük değil, Python topluluğunda kullanılan standart parametre adıdır. Bir metodu nesne üzerinden çağırdığında, örneğin gorev.tamamla() yazdığında self değerini ayrıca yazmazsın; Python ilgili nesneyi otomatik olarak metoda iletir.
Girinti de sınıf yapısının temel parçasıdır. class satırından sonra sınıfa ait metotlar girintili yazılır. Bir metodun içindeki işlemler ise metot satırına göre bir seviye daha içeride olmalıdır. Sınıfı tanımlamak ile sınıfı çağırmak farklı işlemlerdir: class Gorev: şablonu tanımlar, Gorev("Sunumu hazırla") ise bu şablondan bir nesne oluşturur.
Görev takip örneğinde özellik ve metot nasıl ayrılır?
Görev takip örneğinde özellikler görevin verilerini, metotlar ise görev üzerinde yapılabilecek işlemleri temsil eder. Örneğin baslik ve tamamlandi bir görevin özellikleri, tamamla() ise görevin davranışıdır.
- Sınıf şablonunu tanımla:
class Gorev:ifadesi, görev nesnelerinin hangi yapıya sahip olacağını belirler. - Özellikleri ata:
baslikgörevin adını,tamamlandiise görevin bitirilip bitirilmediğini tutar. - Davranışları metotla tanımla:
tamamla()metodu, görevin tamamlanma durumunu değiştirir. - Bir nesne oluştur:
gorev1 = Gorev("Python çalış")ifadesi sınıftan ilk görevi üretir. - İkinci nesneyi üret:
gorev2 = Gorev("Ödev teslim et")ifadesi aynı sınıftan farklı bir görev oluşturur.
| Kavram | Kodda görünümü | Görev takip anlamı |
|---|---|---|
| Sınıf | class Gorev: |
Görev nesneleri için şablon |
| Özellik | self.baslik |
Görevin adı |
| Özellik | self.tamamlandi |
Görevin tamamlanma durumu |
| Metot | tamamla() |
Görevi tamamlandı durumuna getiren davranış |
| Nesne | gorev1 veya gorev2 |
Sınıftan üretilmiş belirli bir görev |
gorev1 ve gorev2 aynı sınıftan üretilir, ancak özellikleri birbirinden bağımsızdır. İlk görevi tamamlamak, ikinci görevin tamamlandi değerini kendiliğinden değiştirmez.
Birden fazla nesne oluşturan çalışan görev sınıfı

Aşağıdaki örnekte sınıf, iki görev nesnesi oluşturmak ve yalnızca ilk görevi tamamlamak için kullanılır:
class Gorev:
def __init__(self, baslik):
self.baslik = baslik
self.tamamlandi = False
def tamamla(self):
self.tamamlandi = True
def durum(self):
if self.tamamlandi:
return "Tamamlandı"
return "Bekliyor"
gorev1 = Gorev("Python çalış")
gorev2 = Gorev("Ödev teslim et")
gorev1.tamamla()
print(f"{gorev1.baslik} - {gorev1.durum()}")
print(f"{gorev2.baslik} - {gorev2.durum()}")
Beklenen çıktı şöyledir:
Python çalış - Tamamlandı
Ödev teslim et - Bekliyor
self, o anda işlem yapılan nesneyi temsil eder. gorev1.tamamla() çağrıldığında self.tamamlandi yalnızca gorev1 için True olur. gorev2 kendi durum bilgisini taşıdığı için Bekliyor sonucunu verir.
Geliştirme adımı: Sınıfa bir oncelik özelliği ekle. Her görev kendi önceliğini saklamalı ve bu bilgi ya yazdırılmalı ya da yeni bir metotla gösterilmelidir. Kabul ölçütü, iki görevin farklı öncelik değerlerini bağımsız biçimde taşıyabilmesidir.
Sınıf kullanmak ne zaman mantıklıdır?
Sınıf kullanmak, aynı türden birden fazla varlığın özelliklerini ve bu özellikler üzerinde çalışan metotları birlikte yönetmek istediğinde anlamlıdır. Görev takip örneğinde görev adı, tamamlanma durumu ve öncelik veridir; görevi tamamlama gibi işlemler ise davranıştır. Birden fazla görev oluşturacak, durumlarını zaman içinde değiştirecek ve aynı yapıyı tekrar kullanacaksan sınıf düzenli bir çerçeve sunabilir.
Her problem sınıf gerektirmez. Tek seferlik bir dönüşüm, küçük bir hesaplama veya kısa bir betik için fonksiyon, liste ya da sözlük daha anlaşılır kalabilir. Sınıf eklemek kodu otomatik olarak daha iyi yapmaz. Kararı, verinin davranışla ne kadar birlikte yaşayacağına ve aynı yapının tekrar edilip edilmeyeceğine göre vermek daha sağlıklıdır.
Hata teşhisinde birkaç noktayı özellikle kontrol et. self unutulursa metot nesneyi alamaz veya özelliklere erişemez. __init__ adı yanlış yazılırsa Python bunu özel başlangıç metodu olarak tanımaz ve beklenen özellikler kurulmayabilir. Bir özelliği self olmadan tanımlamak, onu nesneye değil yalnızca metot içindeki geçici alana dönüştürebilir. Gerekli parametreleri vermeden sınıfı çağırmak TypeError oluşturabilir. Ayrıca her nesne kendi örnek özelliklerini taşır; bir nesnenin durumunu değiştirmek, diğer nesneyi kendiliğinden değiştirmez.
Bu ölçütleri ve temel sözdizimini kendi başına kontrol etmek için Python bilgi testi üzerinden hangi konuları tekrar etmen gerektiğini görebilirsin.
Kısacası sınıf, zorunlu bir kalıp değil, tekrar eden ve zaman içinde değişen yapıları daha düzenli yönetmek için kullanılan bir araçtır.
Görev sınıfını geliştirerek nasıl pratik yapabilirsin?
İlk adım, mevcut görev sınıfına oncelik özelliğini eklemektir. __init__ içinde bu değeri self.oncelik ile nesneye bağla ve yeni nesne oluştururken önceliği gönder. Çalıştırmadan önce gorev.oncelik ifadesinin verdiğin değeri, örneğin 1 değerini yazdıracağını tahmin et.
İkinci adımda oluşturduğun görev nesnelerini gorevler adlı bir listede tut. Listeyi dolaşıp görev adlarını yazdırmadan önce çıktının nesneleri eklediğin sırayla göstereceğini düşün. Böylece tek bir nesne yerine bir koleksiyon üzerinde metot çağırmayı ve özellik okumayı denersin.
Üçüncü adım, tamamlanmamış görevleri ayırmaktır. tamamlandi özelliğini kontrol ederek not gorev.tamamlandi koşuluna uyan nesneleri seçebilirsin. Çalıştırmadan önce yalnızca tamamlanmamış görev adlarının görünmesini bekle. Sonuç farklıysa sınıf adını, nesne oluşturma satırını, özellik adını, metot tanımını ve metotların çağrılma sırasını tek tek kontrol et.
Bu tür geliştirmeleri kişiye özel müfredat ve ödevlerle düzenli sürdürmek istersen, Berk Akademi'nin birebir Python özel ders programı hakkında bilgi alabilirsin. Bu yönlendirme, yalnızca nesne yönelimli programlamaya ayrılmış ayrı bir program anlamına gelmez.
Sık Sorulan Sorular
__init__ metodu yazılmazsa sınıf nasıl davranır?
__init__ tanımlanmazsa sınıf kendi başlangıç atamalarını yapmaz. Özel parametre gerekmiyorsa nesne oluşturulabilir, ancak beklenen özellikler kurulmadığı için sonradan bu özelliklere erişirken hata alabilirsin.
self parametresi neden her metotta kullanılır?
self, örnek metodunun hangi nesne üzerinde çalıştığını gösterir. Bu sayede metot, o nesneye ait özellikleri okuyabilir veya değiştirebilir. Buradaki kural örnek metotları içindir; sınıf ve statik metotlarda kullanım farklıdır.
Python'da her problem için sınıf kullanmak gerekir mi?
Hayır. Küçük ve tek seferlik işlemlerde fonksiyonlar, listeler veya sözlükler daha sade olabilir. Sınıfı, veriyi davranışlarla birlikte taşıdığında ve aynı yapıyı tekrar kullanacağında değerlendirebilirsin.
Sınıf kararını bir zorunluluk olarak değil, problemin yapısına göre seçilen bir tasarım aracı olarak düşün.