Menu
Coddy logo textTech

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 örneklenemeyen ve alt sınıflar tarafından uygulanması gereken soyut yöntemleri içeren sınıflardır.

Bunu bir form gibi düşün: Soyut bir sınıf, bazı alanların zorunlu (soyut yöntemler), bazılarının ise isteğe bağlı (somut yöntemler) olduğu zorunlu bir form kodu 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ın:

from abc import ABC, abstractmethod

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

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 yöntemleri işaretler - bunlar formunuzdaki "zorunlu alanlar"dır. describe() gibi normal yöntemlerin uygulamaları olabilir ve oldukları gibi miras alınırlar - bunlar "önceden doldurulmuş alanlar"dır.

Soyut sınıflar neden kullanılır? Bir sözleşme dayatırlar. Eğer bir Shape sınıfı oluşturursanız, "her şekil alanını ve çevresini hesaplayabilmelidir" demiş olursunuz. Bu, kritik metotları uygulamayı unutabileceğiniz hataları önler.

Soyut sınıfın bir örneğini oluşturmaya çalışın:

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

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

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

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 eksiksiz, somut bir sınıftır.

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

circle = Circle(5)
print(circle.area())
print(circle.perimeter())
print(circle.describe())  # Kalıtım yoluyla alınan somut metot

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

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

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

challenge icon

Görev

Orta

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

Bu dosyalardaki uygulamayı tamamlaman gerekiyor:

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

Gerekli işlevselliği uygulamak için her dosyadaki TODO yorumlarını takip et. Yorumlar, soyut yöntemler oluşturma, somut alt sınıfları uygulama ve dosyalar arasında uygun içe aktarma ilişkileri kurma sürecinde sana adım adım yol gösterecek.

driver.py dosyası, uygulamanın doğru şekilde çalıştığını doğrulayacak test senaryolarını içerir; 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şle
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")

# Yorum satırı kaldırılırsa bu bir hata verir:
# pm = PaymentMethod()  # Soyut sınıf örneği 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