7.2 מחלקה (לא חובה) הרצאה
הקדמה¶
- בפרק נלמד כל מיני דברים מיוחדים בפייתון שמתקשרים למחלקות, הפרק הוא אופציונאלי (לא חובה)כי הוא מדבר על פיצ'רים מתקדמים בפייתון, אך מומלץ!
ממברים של מחלקה¶
- השדה
__dict__מעניק לנו גישה למילון של כל הממברים של המחלקה
- אנחנו יכולים לגשת לממברים שונים באמצעות המילון הזה,
- אנחנו יכולים באמצעתו לגשת למתודות שונות במחלקה
- לצערנו כל פעם שנקרא למתודה במחלקה אנחנו נצטרך להעביר לה את האובייקט כהפרמטר
selfשלה, וזה לא נוח לנו. - בשביל לפתור את הבעיה נשתמש בפונקציה
__get__שמאפשרת לנו לקבל את המתודה לאחר שהביאו לה את self בצורה הבאה:
- באמצעות שילוב של
__dict__ושל__get__אנחנו יכולים לגשת למתודות של המחלקה! - למעשה ככה פייתון עובד, כאשר אנחנו כותבים את הביטויי הבא:
- פייתון מתרגם אותו ל -
- אבל איך פייתון ניגש למתודות סטטיות? הריי מתודות סטטיות לא מקבלות את self כמו שאנחנו העברנו לו,
- זה יכול לקרות באחת משלושת הדרכים הבאות:
- כל המתודות האלו זהות לביטוי הבא:
- אז לסיכום, הממברים
__dict__,__get__, ו -__func__כולם נקראים כאשר פייתון מנסה לגשת לממברים סטטית או דינמית.
נצור מחדש את הדקורטור staticmethod¶
- בהתאם לידע החדש שרכשנו, נשתמש ב
classכדי לצור את הדקורטורstaticmethodבעצמנו - איך נעשה את זה?
- דקורטור מקבל פונקציה כפרמטר, אז ניישם את
__init__מחדש כדי לקבל את הפנקציה כפרמטר - כאשר פייתון יקרא ל
__get__על הדקורטור שלנו אנחנו נצטרך להביא לו את הפונקציה המקורית ללא קשר לאיזה אובייקט הוא העביר לנו. - לפעמים כשמנסים לגשת לפונקציות סטטית יכולים לגשת אלייה באמצעות
__func__, אז נוודא שגם במקרה שהוא מנסה לגשת לשדה זה נחזיר לו את הפונקציה המקורית.
class my_staticmethod: def __init__(self, callable): self.f = callable def __get__(self, obj=None, type): return self.f @property def __func__(self): return self.f class MyClass @my_staticmethod def member(a): return a+1 MyClass.__dict__['member'].__get__(None, MyClass) MyClass.__dict__['member'] obj = MyClass() MyClass.__dict__['member'].__get__(obj, MyClass) MyClass.__dict__['member'].__get__(obj, MyClass).__func__ MyClass.member(3)
- דקורטור מקבל פונקציה כפרמטר, אז ניישם את
- יצרנו בעצמנו את הדקורטור
staticmethod, כל הכבוד לנו! שימו לב שבגלל שפייתון ממש בעצמו את הדקורטורstaticmethodלא באמת בשפת פייתון, הדקורטור שכתבנו לא יתנהג בדיוק כמוstaticmethodאז אל תשתמשו בו בקוד אמיתי :)
איך אובייקט נולד?¶
- אז איך באמת אובייקט נולד?
- ברגע שאנחנו מריצים את השורה למעלה הדבר הראשון שנקרא זה המתודה
__new__, ומטרתה היא לצור אובייקט חדש מסוג המחלקהMyClass, המתודה הזו מוגדרת על ידי המחלקהobject, ואנחנו לא מיישמים אותה מחדש (כמו שאנחנו עושים לרוב), כי זה עלול לשבור את הדרך שבה אובייקטים נוצרים. - אחרי ש
__new__יוצר לפייתון אובייקט חדש כזה, נקראת המתודה__init__של המחלקה שאנחנו כבר מכירים. מטרת המחלקה היא לאתחל שדות שונים לאובייקט החדש, ובדרך כלל אנחנו ניישם מחדש את המתודה הזו. - אפשר לדמיין את הקוד שאחרי על יצירת אובייקטים בפייתון לכזה: