Menu
CoddyTech

Soyut Sınıflar ve Metotlar

Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 25 / 64.

Özet sınıflar, doğrudan örneği oluşturulamayan ve alt sınıflar tarafından uygulanması gereken soyut yöntemler içeren sınıflardır.

Bunu bir form gibi düşün: Soyut sınıf, bazı alanları zorunlu (soyut yöntemler), bazıları isteğe bağlı (somut yöntemler) olan doldurulması zorunlu bir form gibidir. Formun kendisini gönderemezsin; önce tüm zorunlu alanları doldurmalısın. Benzer şekilde, bir alt sınıfta tüm soyut yöntemler uygulanana kadar soyut bir sınıfın örneklerini oluşturamazsın.

Soyut sınıflar oluşturmak için abc modülünü içe aktar:

from abc import ABC, abstractmethod

Soyut metotlara sahip bir soyut sınıf oluştur:

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass
    
    @abstractmethod
    def perimeter(self):
        pass
    
    def describe(self):
        return "This is a shape"  # Somut metot (uygulaması vardır)

@abstractmethod dekoratörü, alt sınıflar tarafından mutlaka uygulanması gereken metotları işaretler; bunlar formundaki "zorunlu alanlardır". describe() gibi sıradan metotların uygulamaları olabilir ve olduğu gibi devralınırlar; bunlar da "önceden doldurulmuş alanlardır".

Neden soyut sınıflar kullanılır? Bir sözleşmeyi zorunlu kılarlar. Bir Shape sınıfı oluşturursan, “her şeklin alanını ve çevresini hesaplayabilmesi GEREKİR” demiş olursun. Bu, önemli yöntemleri uygulamayı unutabileceğin durumlarda hataların oluşmasını önler.

Özet sınıftan bir örnek oluşturmaya çalış:

# Bu bir hataya neden olur:
# shape = Shape()  # TypeError: Soyut sınıfın örneği oluşturulamaz

Bu hata kasıtlıdır; boş bir form göndermeye çalışmak gibidir. Python, "Gerekli alanları (alan ve çevre yöntemlerini) henüz doldurmadın!" diyor.

Tüm soyut yöntemleri uygulayan somut bir alt sınıf oluştur:

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius ** 2
    
    def perimeter(self):
        return 2 * 3.14 * self.radius

Artık "gerekli tüm alanları doldurduk" — hem area() hem de perimeter() yöntemlerini uyguladık. Circle sınıfı artık örneği oluşturulabilen, tamamlanmış somut bir sınıftır.

Artık somut sınıfın örneklerini oluşturabilirsin:

circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe())  # Miras alınan somut metot

Başka bir somut alt sınıf oluştur:

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width  self.height
    
    def perimeter(self):
        return 2 * (self.width + self.height)

rectangle = Rectangle(4, 6)
print(rectangle.area())
print(rectangle.perimeter())

Çıktı:

78.5
31.400000000000002
This is a shape
24
20

Özet sınıflar, alt sınıfların uyması gereken bir sözleşme tanımlar. Özet sınıflar oluşturmak için ABC ve @abstractmethod kullan. Alt sınıflar tüm özet metotları uygulamalıdır; aksi takdirde onlar da özet olur. Bu, tutarlılığı sağlar ve eksik uygulamaları önler.

challenge icon

Görev

Orta

Bu görevde bir ödeme işleme sistemi uygulayacaksın.

Uygulamayı şu dosyalarda tamamlaman gerekiyor:

  • paymentmethod.py - Doğrulama mantığı içeren soyut temel sınıf
  • creditcard.py - Kredi kartı ödeme uygulaması
  • paypal.py - PayPal ödeme uygulaması

Gerekli işlevleri uygulamak için her dosyadaki TODO yorumlarını izle. Yorumlar; soyut metotları oluşturma, somut alt sınıfları uygulama ve dosyalar arasında doğru içe aktarma ilişkilerini kurma adımlarında sana yol gösterecek.

driver.py dosyası, uygulamanın doğru çalıştığını doğrulayacak test örneklerini içerir. Bu örnekler farklı ödeme senaryolarını işler ve her ödeme yöntemi için uygun ayrıntıları görüntüler.

Kendin dene

from creditcard import CreditCard
from paypal import PayPal

# Uygulamaları test edin - BU TEST KODUNU DEĞİŞTİRMEYİN
cc = CreditCard("1234567890123456")
pp = PayPal("user@example.com")

# Geçerli ödemeleri işleyin
if cc.validate(100):
    print(cc.process_payment(100))
    print(cc.payment_details())

if pp.validate(200):
    print(pp.process_payment(200))
    print(pp.payment_details())

# Geçersiz bir tutar deneyin
if not pp.validate(0):
    print("Invalid payment amount")

# Yorumdan çıkarılırsa bu bir hataya neden olur:
# pm = PaymentMethod()  # Soyut sınıftan örnek oluşturulamaz
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Python derleyicisi