Menu
Coddy logo textTech

Şablon Metot Kalıbı

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

Şablon Yöntemi Deseni, bir algoritmanın iskeletini temel sınıfta tanımlar ve alt sınıfların algoritmanın yapısını değiştirmeden belirli adımları geçersiz kılmasına olanak tanır.

İşte bir şablon yöntemi içeren temel sınıf:

class DataProcessor:
    def process(self):
        """Algoritma yapısını tanımlayan şablon metot"""
        self.read_data()
        self.process_data()
        self.save_data()
    
    def read_data(self):
        print("Reading data...")
    
    def process_data(self):
        raise NotImplementedError("Subclasses must implement this")
    
    def save_data(self):
        print("Saving data...")

Şablon yöntemi process() algoritma adımlarını tanımlarken process_data() alt sınıfların uygulaması için bırakılır.

Soyut yöntemi uygulayan somut sınıflar oluşturun:

class CSVProcessor(DataProcessor):
    def process_data(self):
        print("Processing CSV data")

class JSONProcessor(DataProcessor):
    def process_data(self):
        print("Processing JSON data")

Her somut sınıf, gerekli adımın kendi uygulamasını sağlar.

Şablon yöntemini kullanın:

csv_processor = CSVProcessor()
csv_processor.process()

print()  # Boş satır

json_processor = JSONProcessor()
json_processor.process()

Oyun şablonuyla başka bir örnek oluştur:

class Game:
    def play(self):
        """Bir oyunu oynamak için şablon metodu"""
        self.start_game()
        self.play_game()
        self.end_game()
    
    def start_game(self):
        print("Game started!")
    
    def play_game(self):
        raise NotImplementedError("Define the game rules")
    
    def end_game(self):
        print("Game ended!")

class Chess(Game):
    def play_game(self):
        print("Playing chess - thinking strategically...")

class Soccer(Game):
    def play_game(self):
        print("Playing soccer - running and kicking...")

chess = Chess()
chess.play()

Çıktı:

Reading data...
Processing CSV data
Saving data...

Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!

Temel Nokta: Şablon Yöntem Deseni, alt sınıfların belirli adımları özelleştirmesine olanak tanırken üst sınıfta ortak bir algoritma yapısı tanımlar. Üst sınıf genel akışı kontrol eder, ancak alt sınıflar belirli uygulamaları sağlar. Bu, tek tek adımlarda esnekliğe izin verirken tutarlı bir yapı sağlar.

challenge icon

Görev

Orta

Template Method desenini template.py içinde uygulayın. Soyut Report sınıfı, her zaman aynı üç adımı aynı sırayla çalıştıran şablon metoduna generate() sahiptir: header(), body(), footer().

  • header() her rapor tarafından paylaşılır ve === Report === yazdırır.
  • body() soyuttur: her alt sınıf kendi içeriğini yazdırır.
  • footer(), varsayılan olarak === End === değerine sahip bir kancadır; bir alt sınıf bunu geçersiz kılabilir.

Ardından iki somut raporu yazın:

  • SalesReport(total), toplamı self._total içinde saklar ve gövdesinde Total sales: {total} yazdırır.
  • InventoryReport(items), listeyi self._items içinde saklar, gövdesinde her öğe için Item: {item} yazdırır ve alt bilgiyi === {count} items === yazdıracak şekilde geçersiz kılar.

driver.py kilitlidir: raporları oluşturur ve üzerlerinde generate() metodunu çağırır. Alt sınıflar arasında yalnızca adımlar farklıdır; adımların sırası temel sınıfta bir kez tanımlanmıştır.

Kendin dene

from template import SalesReport, InventoryReport

# Test case işleyicisi (değiştirmeyin)
test_case = input()

if test_case == "sales_test":
    SalesReport(1500).generate()
elif test_case == "inventory_test":
    InventoryReport(["Laptop", "Mouse"]).generate()
elif test_case == "both_test":
    for report in [SalesReport(200), InventoryReport(["Pen"])]:
        report.generate()
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