מתודות מיוחדות
בנוסף למתודות הרגילות, קיימות מספר מתודות מיוחדות שמחלקות
פיתון יכולות להגדיר. מתודות אלו לא נקראות באופן ישיר על ידי הקוד
שלך, אלא נקראות על ידי פיתון במקרים מיוחדים או בעקבות שימוש בפקודות
מיוחדות.
ניתן לעשות דברים רבים בעזרת מתודות "רגילות" , אולם ישנם דברים
רבים שניתן לעשות בעזרת מילון מעבר לשימוש במתודות הרגילות. למשל –
כדי להציב ולשלוף אלמנטים מתוך המילון, יש לממש מתודות מיוחדות במחלקה
היורשת.
def
__getitem__(self, key): return
self.data[key] >>> f =
fileinfo.FileInfo("/music/_singles/kairo.mp3")
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__getitem__("name")
'/music/_singles/kairo.mp3'
>>> f["name"]
'/music/_singles/kairo.mp3'
העבירו את הסמן מעל השורות המסומנות לקבלת
הסברים
המתודה המיוחדת __getitem__ היא פשוטה למדי
בהגדרתה – היא שולפת את האלמנט הרלוונטי מהמילון. אולם – מתי קוראים
לה? ובכן, איננו קוראים לה (מלבד לצרכי הדגמה) בעצמינו, אלא אנו
גורמים לפיתון לקרוא לה בעצמה.
זהו המקום בו אנו גורמים לפיתון לקרוא לפונקיה שהגדרנו. פיתון
מחליפה את הפקודה שכתבנו כאן, בפקודה הדומה לפקודה שמעליה, וקוראת
למתודה __getitem__ שהגדרנו. זוהי הסיבה שמתודה זו נקראת
מתודה מיוחדת.
בדומה למתודה שראינו זה עתה, גם המתודה __setitem__ היא מתודה מיוחדת, הנקראת על ידי פיתון
במקרים מיוחדים, כמו בדוגמה הבאה:
def
__setitem__(self, key, item): self.data[key] =
item
>>> f
{'name':'/music/_singles/kairo.mp3'}
>>> f.__setitem__("genre", 31)
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':31}
>>> f["genre"] = 32
>>> f
{'name':'/music/_singles/kairo.mp3', 'genre':32}
העבירו את הסמן מעל השורות המסומנות לקבלת הסברים
חשוב להבין, שהגדרת המתודות המיוחדות
נותנת את האפשרות לכל מחלקה לשמור זוגות של מפתח-ערך בדומה למילון,
ולגשת אליהם באותו דקדוק של מילון, רק על ידי הגדרת המתודות
__getitem__ ו __setitem__. כאן טמון כוחן של המתודות
המיוחדות – הן נותנות לנו את האפשרות להשתמש בדקדוק נוח על מחלקות
שהגדרנו, כאילו הן אוביקטים מסוג אחר, דבר שהופך את הקידוד למהיר יותר
ואת הקוד לקריא יותר.
חשוב להבין, שהגדרת המתודות המיוחדות נותנת את
האפשרות לכל מחלקה לשמור זוגות של מפתח-ערך בדומה למילון, ולגשת אליהם
באותו דקדוק של מילון, רק על ידי הגדרת המתודות __getitem__ ו __setitem__. כאן טמון כוחן של
המתודות המיוחדות – הן נותנות לנו את האפשרות להשתמש בדקדוק נוח על
מחלקות שהגדרנו, כאילו הן אוביקטים מסוג אחר, דבר שהופך את הקידוד
למהיר יותר ואת הקוד לקריא יותר.
נסתכל עת מספר דוגמאות נוספות למתודות מיוחדות:
def
__repr__(self): return
repr(self.data)
def __cmp__(self, dict):
if isinstance(dict,
UserDict):
return cmp(self.data,
dict.data)
else:
return cmp(self.data,
dict)
העבירו את הסמן מעל השורות המסומנות לקבלת הסברים
המתודה __repr__ נקראת כשאנו קוראים לפונקציה repr(instance). זוהי פונקציה שמחזירה יצוג במחרוזת של
האוביקט המועבר לה. פונקציה זו עובדת על כל אוביקט, ולא רק על
מופעים של מחלקות. פונקציה זו נקראת בכל פעם שאנו כותבים משתנה
כלשהו בחלון האינטראקטיבי של פיתון, ולוחצים ENTER.
המתודה __cmp__ נקראת בכל פעם שמשווים מופעים של אוביקטים,
גם בעזרת אופרטור כדוגמת ==. ישנם חוקים המגדירים מהו שיוויון
בין אוביקטים מאותו סוג בפיתון (לדוגמה - מתי שני מילונים שווים)
ובעזרת פונקציה זו ניתן להגדיר את לוגיקת ההשוואה במחלקה שלנו,
ואז להשתמש באופרטור == ולהשוות מופעים שונים של המחלקה.
ישנן עוד מתודות מיוחדות רבות – כאלה המאפשרות למחלקות להתנהג
כמו מספרים (כדי לחבר, להכפיל וכד' מופעים של המחלקה). המתודה __call__ מאפשרת למחקה להתנהג כמו פונקציה, וכך
להפעיל מופעים באופן ישיר. חלק ממתודות אלו יוצגו בפרקים הבאים.
|