Menu
Coddy logo textTech

מבוא למתודות קסם

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Python של Coddy. שיעור 33 מתוך 64.

מתודות קסם (הנקראות גם מתודות dunder) הן מתודות מיוחדות עם שני קווים תחתונים בתחילתן ובסופן. Python קוראת להן באופן אוטומטי בתגובה לפעולות מסוימות.

הנה דוגמה למחלקה עם מתודות קסם:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"

המתודה __init__ נקראת אוטומטית כשאתה יוצר אובייקט:

my_book = Book("Python Programming", "John Smith", 350)

המתודה __str__ נקראת אוטומטית כשממירים את האובייקט למחרוזת:

print(my_book)        # קורא ל-__str__ באופן אוטומטי
print(str(my_book))   # קורא גם ל-__str__

פלט:

Python Programming by John Smith
Python Programming by John Smith

ללא __str__, הדפסה הייתה מציגה את מיקום האובייקט בזיכרון:

class SimpleBook:
    def __init__(self, title):
        self.title = title

simple = SimpleBook("Test Book")
print(simple)  # <__main__.SimpleBook object at 0x...>

הוסיפו שיטת קסם נוספת עבור אורך:

class Book:
    def __init__(self, title, author, pages):
        self.title = title
        self.author = author
        self.pages = pages
    
    def __str__(self):
        return f"{self.title} by {self.author}"
    
    def __len__(self):
        return self.pages

my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book))   # קורא ל-__len__ באופן אוטומטי

פלט:

350

נקודה חשובה: שיטות קסם מתחילות ומסתיימות בשני קווים תחתונים (__method__) ונקראות אוטומטית על ידי Python. הן מאפשרות לאובייקטים שלך לעבוד עם פונקציות מובנות כמו str(), len() ואופרטורים, וכך הופכות את המחלקות שלך ליותר פייתוניות ואינטואיטיביות לשימוש.

challenge icon

אתגר

קל

באתגר הזה תממשו מחלקת Counter עם מתודות קסם.

  • counter.py - זה הקובץ שעליכם לערוך, והוא מכיל הערות TODO שינחו אתכם במימוש
  • driver.py - מכיל מקרי בדיקה נרחבים

ממשו את מחלקת Counter בקובץ counter.py ואת מקרי הבדיקה בקובץ driver.py, בהתאם להערות TODO. המחלקה צריכה לתמוך באתחול עם ערכים אופציונליים, בייצוג כמחרוזת ובפעולות חיבור.

נסו בעצמכם

# TODO: ייבאו את המחלקה Counter מהקובץ counter.py
# השתמשו בתבנית: from counter import Counter

# מטפל מקיף במקרי בדיקה
test_case = input()

if test_case == "init_test":
    # TODO: בדקו את האתחול עם ערך ברירת המחדל
    # צרו מונה ללא ארגומנטים והדפיסו אותו
    # פלט צפוי: "Count: 0"
    pass

elif test_case == "init_with_value":
    # TODO: בדקו את האתחול עם ערך מסוים
    # צרו מונה עם ערך התחלתי 10 והדפיסו אותו
    # הערה: print() קוראת ל-__str__ באופן מרומז, אבל כאן אנו מתמקדים בבדיקת __init__
    # פלט צפוי: "Count: 10"
    pass


elif test_case == "addition":
    # TODO: בדקו את פעולת החיבור
    # צרו מונה עם ערך 3, הוסיפו לו 7 והדפיסו את התוצאה
    # פלט צפוי: "Count: 10"
    pass

elif test_case == "chained_addition":
    # TODO: בדקו פעולות חיבור בשרשרת
    # צרו מונה עם הערך 1, הוסיפו לו 2, לאחר מכן הוסיפו לתוצאה 3 והדפיסו
    # פלט צפוי: "Count: 6"
    pass

elif test_case == "negative_values":
    # TODO: בדקו ערכים שליליים
    # צרו מונה עם הערך -5 והדפיסו אותו
    # לאחר מכן הוסיפו לו -3 והדפיסו את התוצאה
    # פלטים צפויים: "Count: -5" ו-"Count: -8"
    pass

elif test_case == "zero_value":
    # TODO: בדקו ערכי אפס
    # צרו מונה עם הערך 0, הוסיפו לו 0 והדפיסו
    # פלט צפוי: "Count: 0"
    pass

elif test_case == "large_values":
    # TODO: בדקו ערכים גדולים
    # צרו מונה עם הערך 1000000 והוסיפו לו 9000000
    # פלט צפוי: "Count: 10000000"
    pass

elif test_case == "multiple_counters":
    # TODO: בדקו אינטראקציה בין כמה מונים
    # צרו את counter1 עם הערך 5 ואת counter2 עם הערך 10
    # הדפיסו את שני המונים
    # פלטים צפויים: "Count: 5" ו-"Count: 10"
    pass

elif test_case == "type_validation":
    # TODO: בדוק הוספה של טיפוסים שונים
    # נסה להוסיף מספר מסוג float ‏(2.5) למונה שערכו 5
    # פלט צפוי: "Count: 7.5"
    pass
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Python אונליין