- 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.
| Terim | Anlamı | Örnekte |
|---|---|---|
| Sınıf | nesnelerin planı | Student |
| Nesne | sınıftan oluşturulmuş bir örnek | aysel |
| Nitelik | nesnenin içindeki değişken | self.name |
| Metot | nesnenin içindeki fonksiyon | average() |
İlk sınıfın
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ığındaself,ayselolur.__str__, nesneninprintile 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:
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:
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
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.
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
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.
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.