8

ירושה ופולימורפיזם

Inheritance & Polymorphism

🎯 מטרות הלמידה

  • ירושה בין מחלקות
  • super()
  • דריסת מתודות
  • __str__ ו-__repr__

8.1ירושה

👨‍👦 ירושה = מחלקת בן יורשת מאב

class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        pass

class Dog(Animal):  # יורש מ-Animal
    def speak(self):
        return f'{self.name} says Woof!'

class Cat(Animal):
    def speak(self):
        return f'{self.name} says Meow!'

d = Dog('Rex')
print(d.speak())  # Rex says Woof!

8.2super()

⬆️ super() - קריאה למחלקת האב

class Person:
    def __init__(self, name):
        self.name = name

class Student(Person):
    def __init__(self, name, year):
        super().__init__(name)  # קריאה לבנאי של Person
        self.year = year

s = Student('Dana', 2024)
print(s.name, s.year)  # Dana 2024

8.3super() ודריסת מתודות

🔗 super() - גישה לאב

super() מאפשרת לקרוא למתודות של מחלקת האב מתוך מחלקת הבן. הכי נפוץ: קריאה לבנאי האב.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        return f'שמי {self.name}, גיל {self.age}'

class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)  # קריאה לבנאי האב!
        self.student_id = student_id

    # דריסת מתודה (Method Overriding)
    def introduce(self):
        base = super().introduce()  # לוקחים את הבסיס
        return f'{base}, מספר {self.student_id}'

s = Student('דני', 22, 12345)
print(s.introduce())
# שמי דני, גיל 22, מספר 12345
⚠️ שכחת super().__init__() בבנאי הבן תגרום לכך שמשתני האב (name, age) לא יאותחלו, וגישה אליהם תזרוק AttributeError!

8.4פולימורפיזם

🎭 פולימורפיזם = אותה קריאה, תוצאות שונות

אובייקטים ממחלקות שונות יכולים להגיב באופן שונה לאותה קריאת מתודה. פייתון בוחרת את המתודה הנכונה בזמן ריצה לפי הסוג האמיתי של האובייקט.

class Shape:
    def area(self):
        return 0

class Circle(Shape):
    def __init__(self, r):
        self.r = r
    def area(self):
        return 3.14 * self.r ** 2

class Rectangle(Shape):
    def __init__(self, w, h):
        self.w = w
        self.h = h
    def area(self):
        return self.w * self.h

# פולימורפיזם בפעולה!
shapes = [Circle(5), Rectangle(4, 6), Circle(2)]
for shape in shapes:
    print(shape.area())
# 78.5
# 24
# 12.56
💡 פולימורפיזם מאפשר לכתוב קוד גנרי שעובד עם כל מחלקה שיורשת מ-Shape, בלי לדעת את הסוג הספציפי.

8.5isinstance() ו-type()

🔍 בדיקת סוג אובייקט

פונקציהמה היא בודקתירושה?
isinstance(obj, Class)האם obj הוא מסוג Class או מיורש ממנהכן ✓
type(obj) == Classהאם obj הוא בדיוק מסוג Classלא ✗
class Animal:
    pass

class Dog(Animal):
    pass

d = Dog()
print(isinstance(d, Dog))     # True
print(isinstance(d, Animal))  # True! (כי Dog יורשת מ-Animal)
print(type(d) == Dog)         # True
print(type(d) == Animal)      # False! (type בדיוק)
⚠️ מלכודת מבחן: isinstance() מחזיר True גם למחלקת האב, אבל type() == מחזיר False. המרצה אוהבת לבחון את ההבדל הזה!

שאלות תרגול

5 שאלות בנושא זה

התחל תרגול →