הבנת שיטות הקסם ופונקציות הדנדר של פייתון

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

מהן שיטות קסם?

שיטות קסם הן שיטות מוגדרות מראש ב-Python שאתה יכול לעקוף אותן כדי להתאים אישית את ההתנהגות של האובייקטים שלך. הם לא אמורים להיקרא ישירות אלא מופעלים על ידי הפעולות המובנות של Python. לדוגמה, __init__ היא שיטת קסם המשמשת לאתחול אובייקטים חדשים, בעוד ש-__str__ מגדיר את ייצוג המחרוזת של אובייקט.

שיטות קסם נפוצות

  • __init__: מאתחל אובייקט חדש.
  • __str_: מגדיר את ייצוג המחרוזת של אובייקט.
  • __repr__: מגדיר ייצוג מחרוזת פורמלי של אובייקט שבאופן אידיאלי ניתן להשתמש בו כדי ליצור מחדש את האובייקט.
  • __add__: מגדיר את ההתנהגות של אופרטור ההוספה.
  • __eq__: מגדיר השוואת שוויון.
  • __len_: מחזירה את אורך האובייקט.
  • __getitem__: מאפשר הוספה לאינדקס לאובייקט.
  • __setitem__: מאפשר להגדיר פריט באינדקס ספציפי.

דוגמה: יישום שיטות קסם

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

דוגמה: מחלקה וקטורית עם שיטות קסם

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Vector({self.x}, {self.y})"

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

    def __len__(self):
        return 2  # A vector has two components

# Creating instances of Vector
v1 = Vector(2, 3)
v2 = Vector(4, 5)

# Using magic methods
print(v1)               # Output: Vector(2, 3)
print(repr(v2))         # Output: Vector(4, 5)
print(v1 + v2)          # Output: Vector(6, 8)
print(v1 == v2)         # Output: False
print(len(v1))          # Output: 2

בדוגמה זו, אנו מגדירים את __init__, __str__, __repr__, __add__, __eq__ ו- __len__ שיטות קסם לטיפול בפעולות וייצוגים שונים של המחלקה Vector.

שיטות קסם מתקדמות

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

  • __call__: מאפשר לקרוא לאובייקט כפונקציה.
  • __מכיל__: בודק אם פריט נמצא במיכל.
  • __enter__ ו-__exit__: משמש במנהלי הקשרים כדי לטפל בפעולות הגדרה והסרה.

דוגמה: שימוש ב-__call__ וב-__contains__

class CallableVector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __call__(self, scale):
        return Vector(self.x * scale, self.y * scale)

    def __contains__(self, value):
        return value in (self.x, self.y)

# Creating an instance of CallableVector
cv = CallableVector(2, 3)

# Using __call__
scaled_vector = cv(10)
print(scaled_vector)  # Output: Vector(20, 30)

# Using __contains__
print(2 in cv)        # Output: True
print(5 in cv)        # Output: False

בדוגמה זו, שיטת __call__ מאפשרת לקרוא למופעים של CallableVector כמו פונקציה, בעוד ששיטת __contains__ בודקת חברות ברכיבי הווקטור.

מַסְקָנָה

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