نمط طريقة القالب
جزء من قسم البرمجة كائنية التوجه في رحلة Python على Coddy. الدرس 52 من 64.
يُحدِّد نمط طريقة القالب الهيكلَ الأساسي لخوارزمية في فئة أساسية، مما يتيح للفئات الفرعية تجاوز خطوات محددة دون تغيير بنية الخوارزمية.
إليك فئة أساسية تحتوي على طريقة قالب:
class DataProcessor:
def process(self):
"""طريقة القالب التي تحدد بنية الخوارزمية"""
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...")تُعرِّف طريقة القالب process() خطوات الخوارزمية، بينما تُترك process_data() للفئات الفرعية لتنفيذها.
أنشئ فئات ملموسة تطبّق الطريقة المجرّدة:
class CSVProcessor(DataProcessor):
def process_data(self):
print("Processing CSV data")
class JSONProcessor(DataProcessor):
def process_data(self):
print("Processing JSON data")يوفّر كل صنف ملموس تنفيذه الخاص للخطوة المطلوبة.
استخدم طريقة القالب:
csv_processor = CSVProcessor()
csv_processor.process()
print() # سطر فارغ
json_processor = JSONProcessor()
json_processor.process()أنشئ مثالًا آخر باستخدام قالب لعبة:
class Game:
def play(self):
"""طريقة القالب للعب لعبة"""
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()الناتج:
Reading data...
Processing CSV data
Saving data...
Reading data...
Processing JSON data
Saving data...
Game started!
Playing chess - thinking strategically...
Game ended!النقطة الأساسية: يحدّد نمط طريقة القالب بنية خوارزمية مشتركة في الفئة الأصلية، مع السماح للفئات الفرعية بتخصيص خطوات محددة. تتحكّم الفئة الأصلية في التدفق العام، بينما توفّر الفئات الفرعية التطبيقات المحددة. ويضمن ذلك بنية متسقة مع إتاحة المرونة في الخطوات الفردية.
التحدي
متوسطنفّذ نمط طريقة القالب في template.py. يمتلك الصنف المجرّد Report طريقة القالب generate()، التي تشغّل دائمًا الخطوات الثلاث نفسها بالترتيب نفسه: header()، body()، footer().
- تُستخدم
header()من قِبل كل تقرير، وتطبع=== Report ===. body()مجرّدة: يطبع كل صنف فرعي المحتوى الخاص به.footer()نقطة تمديد ذات قيمة افتراضية هي=== End ===، ويمكن للصنف الفرعي تجاوزها.
ثم اكتب التقريرين الفعليين:
- يخزّن
SalesReport(total)الإجمالي فيself._totalويطبعTotal sales: {total}في جسمه. - يخزّن
InventoryReport(items)القائمة فيself._items، ويطبعItem: {item}لكل عنصر في جسمه، ويتجاوز التذييل ليطبع=== {count} items ===.
الملف driver.py مقفول: فهو ينشئ التقارير ويستدعي generate() عليها. تختلف الخطوات فقط بين الأصناف الفرعية؛ أما ترتيب الخطوات فيوجد مرة واحدة في الصنف الأساسي.
جرّب بنفسك
from template import SalesReport, InventoryReport
# معالج حالة الاختبار (لا تُغيّر)
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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsمعامل selfMethodsAttributesدالة البناء (__init__)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةدالة ()superإعادة تعريف الدوال (Method Overriding)الوراثة المتعددةترتيب استدعاء الدوال (Method Resolution Order)مراجعة - هيكلية الموظفين5تعدد الأشكال
مراجعة إعادة تعريف الدوالمفهوم Duck Typingالأصناف والدوال المجردةتصميم الواجهاتملخص - حاسبة الأشكالتدرّب بنفسك: مترجم Python عبر الإنترنت