5- Nesne Yönelimli Programlama (OOP)

Sınıflar, Nesneler, Miras ve Çok Biçimlilik

1. Sınıflar ve Nesneler

Sınıflar, nesneleri tanımlamak için kullanılan şablonlardır. Nesneler ise sınıflardan oluşturulan bireysel örneklerdir.

Sınıf Tanımlama:

python
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return "Woof!"

Nesne Oluşturma:

python
my_dog = Dog(name="Buddy", age=5)
print(my_dog.name)  # Buddy
print(my_dog.bark())  # Woof!

2. Miras (Inheritance)

Miras, bir sınıfın özelliklerini ve metodlarını başka bir sınıfa aktarmak için kullanılır. Bu, kodun yeniden kullanılabilirliğini ve organizasyonunu artırır.

Miras Kullanımı:

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

    def speak(self):
        return "Some sound"

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

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

Miras ile Nesne Oluşturma:

python
my_cat = Cat(name="Whiskers")
print(my_cat.name)  # Whiskers
print(my_cat.speak())  # Meow!

my_dog = Dog(name="Rex")
print(my_dog.name)  # Rex
print(my_dog.speak())  # Woof!

3. Çok Biçimlilik (Polymorphism)

Çok biçimlilik, farklı sınıfların aynı isimli metodları farklı şekilde uygulamasına olanak tanır. Bu, aynı metodu çağırarak farklı davranışları elde etmemizi sağlar.

Çok Biçimlilik Örneği:

python
animals = [Cat("Whiskers"), Dog("Rex")]

for animal in animals:
    print(animal.speak())  # Meow! \n Woof!

4. Dunder (Magic) Metodlar

Dunder metodlar (ya da sihirli metodlar), Python'da özel davranışları tanımlamak için kullanılır. Bu metodlar, çift alt çizgi ile başlar ve biter.

__init__

Nesne oluşturulduğunda çağrılır. Sınıfın yapıcısıdır.

python
class Person:
    def __init__(self, name):
        self.name = name

__str__

Nesne yazdırıldığında çağrılır. Nesnenin string temsili döner.

python
class Person:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"Person(name={self.name})"

__repr__

Nesnenin temsilini döner ve genellikle debugging için kullanılır.

python
class Person:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Person('{self.name}')"

__len__

Nesnenin uzunluğunu döner (örneğin, bir koleksiyonun uzunluğunu).

python
class Box:
    def __init__(self, items):
        self.items = items

    def __len__(self):
        return len(self.items)

__add__

İki nesneyi toplamak için kullanılır.

python
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

__eq__

İki nesneyi eşitlik açısından karşılaştırmak için kullanılır.

python
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y