בחינה מחדש של דריסת מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Python של Coddy. שיעור 23 מתוך 64.
פולימורפיזם פירושו „צורות רבות”, והוא מאפשר לאובייקטים ממחלקות שונות להגיב באופן שונה לאותה קריאה למתודה. דריסת מתודות מאפשרת זאת.
הנה מחלקת אב עם מתודה:
class Animal:
def speak(self):
return "Animal makes a sound"צרו מחלקות צאצא שמגדירות מחדש את אותה שיטה:
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class Cow(Animal):
def speak(self):
return "Moo!"כל מחלקת צאצא מספקת מימוש משלה של speak().
צרו רשימה של בעלי חיים שונים:
animals = [Dog(), Cat(), Cow(), Animal()]קרא לאותה מתודה בכל האובייקטים:
for animal in animals:
print(animal.speak())פלט:
Woof!
Meow!
Moo!
Animal makes a soundזוהי פולימורפיזם בפעולה — אותה קריאה למתודה מתנהגת באופן שונה בהתאם לטיפוס האמיתי של האובייקט.
אפשר להשתמש בפולימורפיזם גם עם פונקציות:
def make_animal_speak(animal):
print(animal.speak())
dog = Dog()
cat = Cat()
make_animal_speak(dog) # הב הב!
make_animal_speak(cat) # מיאו!הפונקציה לא צריכה לדעת מאיזה סוג בעל חיים היא מקבלת — היא פשוט קוראת ל־speak() ומקבלת את ההתנהגות המתאימה.
נקודה מרכזית: פולימורפיזם מאפשר להתייחס לאובייקטים שונים באותו אופן באמצעות ממשק משותף. דריסת מתודות מספקת מימושים שונים, ואילו פולימורפיזם מאפשר לקרוא להן באופן אחיד. כך הקוד נעשה גמיש יותר וקל יותר להרחבה.
אתגר
בינוניבאתגר הזה תיישמו מערכת ירושה של כלי רכב.
תצטרכו לערוך את הקבצים האלה:
vehicle.py: יישמו את מחלקת הבסיסVehicleעם מאפייני יצרן ודגם ומתודותcar.py: צרו את המחלקהCarשיורשת מ־Vehiclemotorcycle.py: צרו את המחלקהMotorcycleשיורשת מ־Vehicletruck.py: צרו את המחלקהTruckשיורשת מ־Vehicle
כל קובץ מכיל הערות TODO מפורטות שינחו אתכם בתהליך המימוש שלב אחר שלב. שימו לב להצהרות הייבוא הנדרשות בין הקבצים ופעלו לפי קשרי הירושה. הקובץ driver.py מכיל מקרי בדיקה שיוודאו שהמימוש שלכם פועל כראוי בכל סוגי כלי הרכב.
נסו בעצמכם
from vehicle import Vehicle
from car import Car
from motorcycle import Motorcycle
from truck import Truck
def vehicle_info(vehicle):
return f"{vehicle.make} {vehicle.model}: {vehicle.start()}, Efficiency: {vehicle.fuel_efficiency()} mpg"
# בדיקה עם כלי רכב שונים - אין לשנות את קוד הבדיקה הזה
vehicles = [
Car("Toyota", "Camry"),
Motorcycle("Harley", "Davidson"),
Truck("Ford", "F-150"),
Vehicle("Generic", "Vehicle")
]
for v in vehicles:
print(vehicle_info(v))השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםהפרמטר selfמתודותמאפייניםשיטת הבנאי (__init__)חזרה: מחשבון פשוט5פולימורפיזם
בחינה מחדש של דריסת מתודותטיפוסיות ברווזמחלקות ומתודות אבסטרקטיותעיצוב ממשקיםסיכום – מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה לעומת הורשהMixinsמתודות סטטיות ומתודות מחלקהדקורטורים למחלקותמנהלי הקשרתרגלו בעצמכם: קומפיילר Python אונליין