Soyut Sınıflar ve Metotlar
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 25 / 64.
Soyut sınıflar (abstract classes), doğrudan örneği oluşturulamayan ve alt sınıflar tarafından uygulanması gereken soyut yöntemler (abstract methods) içeren sınıflardır.
Bunu bir form gibi düşünün: Soyut bir sınıf, bazı alanların zorunlu (soyut yöntemler) ve bazılarının isteğe bağlı (somut yöntemler) olduğu zorunlu bir form kodu gibidir. Formun kendisini gönderemezsiniz - önce tüm zorunlu alanları doldurmanız gerekir. Benzer şekilde, tüm soyut yöntemler bir alt sınıfta uygulanana kadar soyut bir sınıfın örneklerini oluşturamazsınız.
Soyut sınıflar oluşturmak için abc modülünü içe aktarın:
from abc import ABC, abstractmethodSoyut 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ıftan bir örnek oluşturmayı deneyin:
# Bu bir hataya neden olacaktır:
# shape = Shape() # TypeError: Can't instantiate abstract classBu hata kasıtlıdır - boş bir form göndermeye çalışmak gibidir. Python şunu diyor: "Henüz gerekli alanları (area ve perimeter metotları) doldurmadınız!"
Tüm soyut metotları 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Şimdi "gerekli tüm alanları doldurduk" - hem area() hem de perimeter() metotlarını uyguladık. Circle sınıfı artık örneklenebilen tam, 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 metotBaş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
20Soyut 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.
Görev
OrtaBu meydan okumada, bir ödeme işleme sistemi uygulayacaksınız.
Uygulamayı şu dosyalarda tamamlamanız gerekiyor:
paymentmethod.py- Doğrulama mantığına sahip soyut temel sınıfcreditcard.py- Kredi kartı ödeme uygulamasıpaypal.py- PayPal ödeme uygulaması
Gerekli işlevselliği uygulamak için her dosyadaki TODO yorumlarını takip edin. Yorumlar; soyut yöntemler oluşturma, somut alt sınıfları uygulama ve dosyalar arasında uygun içe aktarma ilişkileri kurma konularında size adım adım rehberlik edecektir.
driver.py dosyası, uygulamanızın doğru çalıştığını doğrulayacak, farklı ödeme senaryolarını işleyecek ve her ödeme yöntemi için uygun ayrıntıları görüntüleyecek test durumlarını içerir.
Kopya kağıdı
Soyut sınıflar doğrudan örneklendirilemezler ve alt sınıflar tarafından uygulanması gereken soyut yöntemler içerirler.
abc modülünü içe aktarın:
from abc import ABC, abstractmethodSoyut yöntemlere sahip bir soyut 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 yöntem (uygulaması var)@abstractmethod dekoratörü, alt sınıflar tarafından uygulanması gereken yöntemleri işaretler. Normal yöntemlerin uygulamaları olabilir.
Soyut sınıflar örneklendirilemez:
# Bu bir hataya neden olur:
# shape = Shape() # TypeError: Can't instantiate abstract classTüm soyut yöntemleri uygulayan somut alt sınıflar 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
circle = Circle(5)
print(circle.area()) # 78.5
print(circle.describe()) # Kalıtım yoluyla alınan somut yöntemAnahtar Nokta: Soyut sınıflar, alt sınıfların uyması gereken bir şablon tanımlar. Alt sınıflar tüm soyut yöntemleri uygulamalıdır, aksi takdirde onlar da soyut kalacaktır.
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şturulamazBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - 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ı