2.20. מחלקה ראשונה

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

2.20.1. מילת המפתח class

מילת המפתח היא class. הגוף מכיל מתודת __init__ שרצה בכל פעם שנוצר מופע חדש:

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

p = Point(3, 4)
print(p.x, p.y)

פלט:

3 4

Point הוא המחלקה; p הוא מופע שלה. הסוגריים בקריאה Point(3, 4) מפעילים את __init__, אשר משייך את הארגומנטים לתכונות במופע החדש. self הוא השם המקובל למופע; self.x קובע תכונה ששאר המתודות של המופע יקראו.

2.20.2. מתי להשתמש במחלקה

פנו למחלקה כאשר כל אלה נכונים בו-זמנית:

  • מספר ערכים קשורים נעים יחד בכל מקום (ה-x וה-y של נקודה; הערך, היחידה וחותמת הזמן של קריאת חיישן).

  • מספר פונקציות מקבלות את אותו אוסף ערכים ופועלות עליהם.

  • שימושי לשמור יותר מאחת מהחבילות הללו חיות בו-זמנית, נבדלות זו מזו.

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

2.20.3. מה __init__ עושה

__init__ הוא פשוט מתודה רגילה. כל דבר שמשויך ל-self בתוכו הופך לתכונה במופע החדש:

class Sensor:
    def __init__(self, name, unit):
        self.name = name
        self.unit = unit
        self.readings = []

temp = Sensor("temperature", "C")
print(temp.name, temp.unit, temp.readings)

פלט:

temperature C []

readings מאותחל לרשימה ריקה – כל מופע חדש מקבל רשימה משלו, לא משותפת. כל דבר שלא משויך ל-self הוא מקומי ל-__init__ ונעלם כשהוא חוזר.