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, abstractmethodSoyut 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şturulamazBu 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.radiusArtı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 metotBaş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.
Görev
OrtaBu 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ıfcreditcard.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şturulamazBu 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
1Nesne Yönelimli Programlamanın Temelleri
Nesne Yönelimli Programlamaya GirişHarici DosyalarSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerKurucu Metot (__init__)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıKendi başına pratik yap: Online Python derleyicisi