İçeriğe geç
Educora
İleri20 dk13 / 42

Nesne yönelimli programlama: sınıflar ve nesneler

Verileri ve davranışları bir araya getir: sınıflar, nesneler, __init__, metotlar, self ve kalıtım.

Kendini test et
Bu derste öğreneceklerin
  • Sınıf ve nesne kavramlarını açıklamak
  • __init__, nitelikler ve metotlarla bir sınıf yazmak
  • Kalıtımı kullanmak ve bir metodu geçersiz kılmak (override)

Bir sınıf defteri programı yazıyorsun: her öğrencinin adı, sınıfı ve notları var; yeni not eklemen ve ortalamaları hesaplaman gerekiyor. 30 öğrenci için ayrı ayrı değişkenler ve fonksiyonlar kısa sürede karmaşaya dönüşür. Nesne yönelimli programlama (NYP) başka bir yol sunar: verileri ve onlarla çalışan fonksiyonları tek bir pakette, yani bir nesnede birleştirmek.

Sınıf ve nesne

Sınıf, nesnelerin planıdır: her nesnenin hangi verilere sahip olacağını ve neler yapabileceğini tanımlar. Nesne ise bu plana göre oluşturulmuş somut bir örnektir. Tek bir planla birçok ev yapılabildiği gibi, bir sınıftan da istediğin kadar nesne oluşturabilirsin.

TerimAnlamıÖrnekte
Sınıfnesnelerin planıStudent
Nesnesınıftan oluşturulmuş bir örnekaysel
Niteliknesnenin içindeki değişkenself.name
Metotnesnenin içindeki fonksiyonaverage()

İlk sınıfın

Python
class Student:
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
        self.scores = []

    def add_score(self, score):
        self.scores.append(score)

    def average(self):
        return sum(self.scores) / len(self.scores)

    def __str__(self):
        return f'{self.name} (grade {self.grade})'

aysel = Student('Aysel', 8)
murad = Student('Murad', 9)
aysel.add_score(5)
aysel.add_score(4)
murad.add_score(3)
print(aysel, aysel.scores)
print(murad, murad.scores)
print('Average:', aysel.average())
▸ Beklenen çıktı
Aysel (grade 8) [5, 4]
Murad (grade 9) [3]
Average: 4.5
  • class Student: yeni bir sınıf tanımlar. Sınıf adları genellikle büyük harfle başlar.
  • __init__ özel bir metottur, yani yapıcıdır (constructor): Student('Aysel', 8) yazıldığında otomatik çağrılır ve nesnenin niteliklerini hazırlar.
  • self, metodun çağrıldığı nesnenin kendisidir. aysel.add_score(5) yazdığında self, aysel olur.
  • __str__, nesnenin print ile nasıl görüneceğini belirler.

Dikkat: aysel ve murad aynı sınıftan oluşturuldu ama her birinin kendi not listesi var. Birine not eklemek diğerini etkilemez; nesneler birbirinden bağımsızdır.

Kalıtım

Kalıtım, var olan bir sınıftan yeni bir sınıf oluşturmayı sağlar. Alt sınıf, üst sınıfın tüm niteliklerini ve metotlarını alır; değiştirmesi gerekenleri de geçersiz kılabilir (override). Aşağıda Dog ve Cat, introduce metodunu Animal'dan hazır alır ama speak metodunu kendilerine göre değiştirir:

Python
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        return '...'

    def introduce(self):
        return f'I am {self.name} and I say {self.speak()}'

class Dog(Animal):
    def speak(self):
        return 'Woof!'

class Cat(Animal):
    def speak(self):
        return 'Meow!'

for pet in [Dog('Rex'), Cat('Mestan'), Animal('Nemo')]:
    print(pet.introduce())
▸ Beklenen çıktı
I am Rex and I say Woof!
I am Mestan and I say Meow!
I am Nemo and I say ...

Aynı introduce() çağrısı her nesnede farklı bir sonuç verdi, çünkü her nesne kendi speak metodunu kullanır. Bu özelliğe çok biçimlilik (polimorfizm) denir. Alt sınıfın yeni bir niteliğe ihtiyacı varsa, onun __init__ metodunda önce super().__init__(...) ile üst sınıfın yapıcısı çağrılır:

Python
class Animal:
    def __init__(self, name):
        self.name = name

class Parrot(Animal):
    def __init__(self, name, words):
        super().__init__(name)
        self.words = words

    def talk(self):
        return self.name + ' says ' + ' and '.join(self.words)

tutu = Parrot('Tutu', ['hello', 'salam'])
print(tutu.talk())
print(isinstance(tutu, Animal))
▸ Beklenen çıktı
Tutu says hello and salam
True
Alıştırma

Player sınıfını yaz: __init__ adı saklasın ve score puanını 0 yapsın, add_points(points) metodu puanı artırsın, __str__ ise Aysel: 25 points biçiminde bir metin döndürsün. Başlangıç kodunun alt kısmı sınıfı dener; onu değiştirme.

Alıştırma · Python
class Player:
    # __init__(self, name): save the name, set score to 0
    # add_points(self, points): add points to score
    # __str__(self): return text like Aysel: 25 points
    pass

aysel = Player('Aysel')
murad = Player('Murad')
aysel.add_points(10)
aysel.add_points(15)
murad.add_points(20)
print(aysel)
print(murad)
▸ Beklenen çıktı
Aysel: 25 points
Murad: 20 points
Alıştırma

Shape sınıfı hazır. Ondan iki alt sınıf türet: Square (kenarı side) ve Rectangle (width ve height). Her biri adını ('Square', 'Rectangle') super().__init__() ile aktarsın ve kendi area() metodunu tanımlasın. Ardından Square(4) ve Rectangle(5, 3) için describe() sonucunu yazdır.

Alıştırma · Python
class Shape:
    def __init__(self, name):
        self.name = name

    def area(self):
        return 0

    def describe(self):
        return f'{self.name}: area {self.area()}'

# 1) class Square(Shape) with side; area = side * side
# 2) class Rectangle(Shape) with width and height
# 3) print describe() for Square(4) and Rectangle(5, 3)
▸ Beklenen çıktı
Square: area 16
Rectangle: area 15

Önemli noktalar

  • Sınıf bir plandır, nesne ise onun somut bir örneğidir.
  • __init__, nesne oluşturulurken otomatik çalışır ve niteliklerini hazırlar.
  • Metodun ilk parametresi self'tir, yani metodun çağrıldığı nesne.
  • class Dog(Animal): kalıtımdır: Dog üst sınıftan her şeyi alır ve metotları geçersiz kılabilir.
  • super().__init__(), alt sınıftan üst sınıfın yapıcısını çağırır.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Sınıf nedir?