הגדרת מחלקות
שפת פיתון
היא שפת תכנות מונחה עצמים מלאה – אפשר להגדיר מחלקות, לרשת ממחלקות
וליצור מופעים ממחלקות שהגדרנו.
כמו הגדרת פונקציות, גם הגדרת מחלקה בפיתון היא פשוטה. אין
צורך להפריד בין ההצהרה על המחלקה להגדרתה – ניתן פשוט להגדיר את
המחלקה ולהתחיל לקודד. מחלקה בפיתון מוגדרת בעזרת המילה השמורה
class, לאחריה שם המחלקה, וזהו – באופן
עקרוני, כיון שמחלקה אינה חייבת לרשת ממחלקה אחרת.
class
foo:
pass
העבירו את
הסמן מעל השורות המסומנות לקבלת הסברים
שם המחלקה הוא foo, והיא אינה
יורשת ממחלקה אחרת.
מחלקה זו אינה מגדירה מתודות כלשהן. באופן דקדוקי אנו חייבים
לכתוב משהו בגוף הפונקציה, ולכן משתמשים במילה pass. זוהי מילה שמורה בפיתון שמשמעותה "נא לזוז הלאה,
אין מה לראות". זוהי פקודה שאינה עוזה דבר, והיא שימושית מאוד
כ"ממלאת מקום" בהגדרת שלדים של מחלקות או פונקציות. כמו בהגדרת פונקציה, כל הקוד של המחלקה מוזח ימינה. שורת
הקוד הראשונה שאינה מוזחת, אינה שייכת למחלקה. הדבר העיקרי שאנו למדים מדוגמה זו, הוא שאין דבר מחייב בהגדרת
מחלקה בפיתון, מלבד שם המחלקה. אין צורך אפילו בהגדרת בנאי למחלקה (כמו
בשפת C++).
from
UserDict
import UserDict class
FileInfo(UserDict):
העבירו את הסמן מעל השורות המסומנות לקבלת
הסברים
הורשה בשפת פיתון מבוטאת על ידי הוספת שם
המחלקה ממנה יורשים בסוגריים, לאחר שם המחלקה החדשה. בדוגמה זו המחלקה
FileInfo יורשת מהמחלקה UserDict.
class
FileInfo(UserDict): "store file
metadata" def
__init__(self, filename=None):
העבירו את הסמן מעל השורות המסומנות לקבלת
הסברים
גם מחלקות יכולות להגדיר
לעצמןdoc_string לתיעוד, כמו פונקציות
ומודולים.
המתודה __init__ נקראת מיד לאחר היווצרות מופע של
המחלקה. אין זה נכון לקרוא לפונקציה זו ה"בנאי" של המחלקה, כיון שהיא
נקראת לאחר שהמופע כבר נוצר במלואו, אך היא הדבר הקרוב ביותר
לפונקצית בנאי המוכרת למתכנתי C++ : היא נקראת
ראשונה עם היווצרות מופע של המחלקה, ולרוב משמשת לאיתחול
האוביקט. הארגומנט הראשון של כל מתודה במחלקה, כולל __init__, הוא הפניה למופע הנוכחי של המחלקה
עליו אנו עובדים. הקונבנציה היא לקרוא לארגומנט זה בשם self. ארגומנט זה צריך להופיע בהגדרת כל מתודה, אך אין
צורך להוספיו בקריאה למתודה – פיתון מוסיפה אותו באופן
אוטומטי. אין הגבלה על מספר הארגומנטים ש __init__ יכולה לקבל. כמו בהגדרת פונקציות
בפיתון, כל ארגומנט יכול לקבל ערכי ברירת-מחדל. בדוגמא הארגומנט
filename מקבל כברירת מחדל את הערך
None שהינו הערך הריק (null value) בפיתון.
class
FileInfo(UserDict): "store file
metadata" def
__init__(self,
filename=None): UserDict.__init__(self)
self["name"] =
filename
העבירו את הסמן מעל השורות
המסומנות לקבלת הסברים
המתודה
__init__ של המחלקה ממנה יורשים אינה נקראת
אוטומטית ביצירת אוביקט של המחלקה הנורשת (בשונה, למשל, משפת
C++). אם אנו מעונינים שהדבר יקרה, עלינו
לקרוא לפונקציה באופן אקספליסיטי.
מחלקה מסוימת זו פועלת בדומה למילון – ומכאן פקודה
זו. יש לשים לב כי המתודה __init__ אינה מחזירה
ערך.
אמנם כיסינו כאן הרבה חומר שיש לעכל, אך אל חשש – כל המחלקות
בפיתון דומות, ולאחר שלמדת אחת מהן היטב – למדת את כולן. הדבר החשוב
ביותר שיש לזכור מפרק זה, הוא הדבר שמכשיל מתכנתי פיתון פעמים רבות:
בהגדירך מחלקה הנורשת ממחלקה אחרת, אסור לשכוח לקרוא למתודת ה
__init__ של המחלקה ממנה
ירשת.
|