מחלקת מעטפת
UserDict
– מחלקת מעטפת.
בפיתון לא ניתן לרשת ממחלקות בסיסיות כדוגמת רשימה או מילון.
כדי לאפשר לנו בכל זאת לבסס מחלקות משלנו על מחלקות אלה, קיימות בפיתון
מחלקות מעטפת, המספקות את אותה הפונקציונליות של המחלקות הבסיסיות,
ושאפשר לרשת מהן: UserString, UserList ו- UserDict. בעזרת שילוב של
מתודות רגילות ומיוחדות, המחלקה UserDict מחקה מילון בצורה טובה מאוד, אך היא מחלקה ככל המחלקות
וניתן לרשת ממנה.
class
UserDict:
def __init__(self,
dict=None):
self.data = {}
if dict is not
None: self.update(dict)
העבירו את הסמן מעל השורות
המסומנות לקבלת הסברים
המחלקה UserDict היא מחלקת בסיס,
ואינה נורשת מאף מחלקה אחרת.
זוהי מתודת ה __init__
שהגדרנו מחדש במחלקה FileInfo. למתודה זו יש רשימת ארגומנטים שונה משל
מתודת ה __init__ שהגדרנו, אך זה אינו מהווה בעיה, כל
זמן שהמחלקה הנורשת קוראת למתודת ה __init__ של מחלקת האב עם רשימת הפרמטרים
הנכונה.
פיתון תומכת גם במשתני מחלקה (data
members). אלו הם משתנים בעלי ערך שונה בכל מופע של המחלקה.
בדוגמה שלנו, כל מופע של UserDict הוא בעל משתנה
המחלקה data. כדי להתייחס למשתנה זה, יש לגשת אליו
בצירוף שם המופע (אם אנו נגשים מבחוץ, למשל על ידי instance.data) או בצירוף המשתנה self (אם אנו נגשים מתוך מתודה של המחלקה). הקונבנציה היא
להגדיר את כל משתני המחלקה בתוך המתודה __init__ ולתת להם ערכים ראשוניים, אך למעשה
ניתן להגדיר משתנים נוספים בכל שלב בתכנית.
לתשומת לב – זהו דקדוק שונה במקצת לביטוי if שנלמד קודם. כאן ישנה רק
פקודה אחת, מיד בהמשך שורת התנאי, ולא בשורה חדשה. זהו דקדוק שימושי
לפקודות קצרות, המקצר את הקוד עצמו, אולם יש להשגיח שהשימוש בו לא
פוגע בקריאות הקוד.
להלן מספר מתודות נוספות של המחלקה UserDict:
def
clear(self):
self.data.clear()
def
copy(self):
if
self.__class__
is UserDict:
return
UserDict(self.data)
import
copy
return
copy.copy(self)
def
keys(self):
return self.data.keys() def
items(self):
return self.data.items() def
values(self):
return self.data.values()
העבירו את הסמן מעל השורות
המסומנות לקבלת הסברים
המתודה clear היא דוגמה
למתודה פשוטה של המחלקה. היא גם דוגמה טובה למימוש המחלקה כולה –
להחזיק משתנה מחלקה מסוג מילון, ולהפעיל עליו את הפונקציות
הרלוונטיות בכל מתודה.
המתודה copy מחזירה עותק חדש
של המילון המקורי. איננו יכולים לקרוא לפונקצית copy של המילון, כיון שזו מחזירה מילון חדש, ואנו
מעונינים להחזיר אוביקט מסוג UserDict.
אנו משםמשים במאפיין __class__ כדי לבדוק האם
אנו מעתיקים אוביקט מסוג UserDict. אם כן, אנו
בפשטות מחזירים אוביקט מסוג זה, ומעבירים אליו כפרמטר את
המילון.
אם קיבלנו אוביקט ממחלקה אחרת, אנו נעזרים במודול של פיתון
בשם copy. לא ניכנס לפרטי מודול זה (אם כי הוא
מומלץ לקריאה), אך נסביר שהוא דואג להעתקה מלאה של כל משתני המחלקה
הרלוונטיים כדי להחזיר עותק של המחלקה
הנחוצה.
אם קיבלנו אוביקט ממחלקה אחרת, אנו נעזרים במודול של פיתון בשם
copy. לא ניכנס לפרטי מודול זה (אם כי הוא
מומלץ לקריאה), אך נסביר שהוא דואג להעתקה מלאה של כל משתני המחלקה
הרלוונטיים כדי להחזיר עותק של המחלקה הנחוצה.
|