
class Person(object). בדוגמה נוצרת מחלקה בשם Person שיורשת מ-object, כמקובל בפייתון 2.7. בתוכה מוגדרת הפונקציה __init__ שהיא הבנאי. הפרמטר הראשון הוא self, שמציין את האובייקט הנוכחי.p = Person(...) יוצר מופע. ניתן לגשת לשדות בנקודה, למשל p.age.happy_bd מוסיפה שנה לגיל, והקריאה נעשית p.happy_bd().__str__ כדי שההדפסה תציג טקסט משמעותי. בלי ההגדרה מוצגים שם המחלקה וכתובת הזיכרון.class Worker(Person) יורש את השדות והמתודות של Person. הבנאי של המחלקה היורשת קורא לבנאי של האב באמצעות super(Worker, self).__init__ עם הפרמטרים הדרושים.self מתקבלת השגיאה "Unbound method init must be called with ... instance".הטקסט המלא של הדקות הראשונות בהרצאה «פייטון Object Oriented - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בשיעור הזה נדבר על Object Oriented בפייתון, על קלאס אובייקטיים, איך יוצרים אובייקטיים, אז בואו נתחיל.
אז אני מניח שכולכם יודעים מה זה קלאס, ולא פעם ראשונה שאתם נתקלתם במונח הזה, אז אני לא אסביר כל כך מה זה. יש קורס שלם על Object Oriented ב-C-Sharp, אתם מוזמנים ללכת לשם וללמוד מה זה Object Oriented, ואז לחזור לפה ודברים יהיו הרבה יותר מובנים.
אז בואו נתחיל על ידי הגדרת קלאס השם person בואו רגע נעצור ונגיד ונראה מה כתב דבר ראשון קלאס מילה שמורה בפייתון כפי שאתם רואים היא בצבע כחול person השם זה בעצם אומר שאני יוצר קלאס person זה השם של הקלאס האות p זה שהיא גדולה זה קונבנציה זה לא חובה Object זה משהו שבצוי מאוד לכתוב בפייתון 2 פלוס.
זה בא לציין איזשהו מעבר מסגנון ישן של קלאסים שהיו נמצאים בפייתון עד 2.1, ובגלל שעברו באמצע פייתון 2.1 אז השאירו את זה עד פייתון 2.7, ופשוט בלי לכתוב Object, בגדול גם זה היה תקין.
יש דברים, מספר דברים ספציפיים שבגללם מומלץ לכתוב Object, אני לא אכנס לזה עכשיו, אז כרגע בואו פשוט ניקח את זה כמשהו שחייבים לעשות, בעצם לרשת מ-Object.
עכשיו, מבחינת הקונסטרקטור או הסמי-קונסטרקטור בפייתון, אז הפונקציה קוראים לה init, במקום this, מי שמכיר משפות אחרות, אז בפייתון זה נקרא self, אז בוא נגיד שלפרסון שלנו יש first name יש לו name יש לו last name ויש לו h עכשיו בואו
נתחיל את זה אז self.name שווה name תשימו לב שיש לנו בפייתון באקליפס יש לנו אופציה לעשות את זה יותר מהר בוא כרגע אני לא מוצא את האופציה באקליפס שעושה את זה אז לא ניכנס לזה יכול לקרוא self.name שווה name self.last name שווה last name וself.h ו-h בוא ניצור אובייקט של קלאס ואז נסביר בדיוק מה קרה לנו פה בוא נשים פה איזושהי
התפסה פרינט עכשיו אני רוצה ליצור פרסון חדש אז נגיד p שווה פרסון ונגיד שהניל שלו זה ג'ון שם המשפחה שלו זה Smith וה-H שלו זה 31 ובוא נדפיס נראה מה יקרה ונדפיס את p.h בוא נריץ את הדבר הזה ונראה מה קורה אוקיי דבר ראשון אנחנו רואים שהגענו לפונקציה in-in-it וכשאנחנו מדפיסים את p מודפס לנו איזשהו משהו לא ברור וכשמדפיסים את h אז
מודפס לנו משהו כן ברור עכשיו בוא נדבר על בעצם מה קרה לנו יצרנו קלאס. ככה מגדירים קלאס. הגדרנו קונסטרקטור.
בפייתון, הקונסטרקטור, האינסטנס עצמו נקרא self. כלומר, אני עכשיו בתוך הפונקציה, ה-dis שלי, כלומר האובייקט עצמו שאני עכשיו עובד עליו בקלאס, אני אתייחס אליו בעזרת self.
ומה אני עושה פה בפונקציה אינית? אני אומר self.name, אני יוצר פה אובייקט חדש בזיכרון של האובייקט שלי, כלומר, אני יוצר פה משהו חדש בדיקשנרי של הקלאס, ואני אומר, ה-Name, הוא מצביע על Name שקיבלתי אותו מבחוץ.
בעצם, אם אני אעשה Got Name, אולי זה קצת יהיה יותר ברור. ובעצם, בואו נשתמש בקונבנציה כזאת, אולי זה יהיה קצת יותר ברור. בעצם, אני השתמשתי פה בקו תחתון סתם כדי לבדל בין ה-Name שאני מקבל בתור פרמטר ל-Name שאני יוצר פה בתוך הפונקציה.
כרגע נדפיס גם את ה-dir של p ונראה מה יש לנו פה. אז יש לנו פה כל מיני אובייקטים של פייתון שנדבר על חלקם עוד מעט, ויש לנו פה את שלושת האובייקטים בחוץ.
בעצם אנחנו רואים שזה קצת מזכיר לנו דיקשנרי. בעצם מה שקיבלנו פה אפשר לומר זה סוג של דיקשנרי, אבל במקום לגשת לכל פילד, לכל אובייקט בדיקשנרי עם צורה כזאת של סוגר ואז זה מתייחס ל-age בתור סטרינג, אנחנו בעצם ניגשים אליו עם נקודה.
ופחות או יותר, אני רואה, אפשר לראות שאנחנו עדיין מתמודדים עם סוג של דיקשנרי. כשאנחנו עושים סלף ניים, אנחנו בעצם מכניסים משהו חדש לדיקשנרי שלנו, שמכיל קי חדש בשם ניים, שמצביע על הניים שקיבלנו מבחוץ.
עכשיו, בגלל שפייתון היא שפה שלא כתוב מה הערכים, אז בעצם 31 פה יכול להיות מספר. והדבר הזה עדיין יעבוד אותו דבר בגלל האופי של השפה.
עכשיו, בואו רגע נדבר על הפרינט p. אנחנו בעצם מדפיסים את p, ופייתון בעצם מדפיסה לנו פה איזשהו משהו שמיין נקודה פרסון אובייקט את.
כלומר, פייתון, אני אומר לפייתון תדפיסי לי את הפרסון והיא לא יודעת בעצם מה זה פרסון. אז היא מדפיסה, היא אומרת לך, תשמע, פייתון, האובייקט פרסון הוא ממוקם אצלי במקום שנקרא מיין.
זה אובייקט מסוג פרסון והוא נמצא אצלי בזיכרון בכתובת הזאת. וזהו. עכשיו, מה אם נרצה להחזיר משהו קצת יותר משמעותי?
אז מי שמכיר ב-Java ו-C-Sharp, אז הכוונה היא ל-String. אז בפייתון עושים את זה ככה. מגדירים פונקציה, כף תחתון, כף תחתון, STR. בעצם שימו לב שהקליפס פה זורק לי הערה Override Method, כלומר אני דורס פה פונקציה שאני יורש מלמעלה, ממקום אחר,
לא צריך את כל הדבר הזה. פונקציה בעצם צריכה להחזיר סטרינג. אז בואו נגיד, נדפיס ככה, נדפיס פשוט self.name ועוד space ועוד self.lastname ועוד ועוד self.h, בואו נראה מה קיבלנו, זו הקלטה קטנה, שימו לב, או אסדר פה כמה הדפסות שזה יהיה יותר ברור,
עוד יותר ברור, ג'ון סמית 31. ואני אוכיח לכם שאנחנו היינו פה, in print, in str נקרא לזה, יותר מדייק, כלומר שאנחנו עושים print לפי למה שאנחנו קוראים בסופו של דבר זה לפרינט נקודה פונקציה str, בעצם כשאנחנו עושים print לפי פייתון מתחת לפני השטח, כולל הפונקציה str שלנו שעכשיו היא ממומשת
ולכן אנחנו יכולים להגיד לו בדיוק מה הכוונה, מה זה person ואיך לבטא אותו ושאנחנו בעצם רוצים שperson יהיה name, last name ו-h. כמובן שיכולנו להגיד שperson זה רק name או רק last name או בעצם שום דבר ובעצם לא ליצור את str אבל זה הרבה יותר נוח כן ליצור את str.
בואו אני אסביר לכם למה אם רגע נעבור למצב של הדיבאגר. בואו נגיד שאנחנו רוצים לדבג את התוכנית. שימו לב שאקליפס שהוא מציג לי את p פה בצד ימין, הוא אוטומטית מציג לי את הכף תחתון str str שלו.
אם נגיד את פונקציות האלה, אם בעצם אני אעלים את ה-str ונריץ שוב, שים לב שפייתון גם כן האקליפס גם כן מציג לי פה את פרסון בתור איזשהו משהו לא ברור.
עכשיו בוא נמשיך לדבר על Object Oriented. אז יש לנו את האובייקט פרסון הזה, עכשיו בוא נראה, אחרי שיצרנו אותו בניגוד לאובייקטים אחרים, קלאס הוא אובייקט מיוטפל, כלומר ניתן לשנות אותו.
כלומר, אם נגיד עכשיו החלטתי שג'ון סמית שלי הוא בן 50, אין לי שום בעיה לעשות p.h שווה 50, ואם אני אדפיס את p עכשיו, אז תוכלו לראות שבעצם ג'ון סמית עכשיו הוא בן 50. אוקיי, אז שום קלאס הוא לא קלאס בלי מתודות.
הפונקציות הן בעצם להזכירכם פונקציות שהן משויכות לקלאס מסוים. אז בואו נתחיל מפונקציה פשוטה שחוגגת יום הולדת לבן אדם, ובעצם מוסיפה לו שנה לגיל.
אז נקרא לה happy, happy bd, והפונקציה לא מקבלת כלום, וכל מה שהיא עושה זה self.h פלוס שווה 1, היא גם לא מחזירה שום דבר.
איך קוראים לפונקציה? אותו דבר p.api.bd ו-printp כפי שאתם רואים ג'ון סמית שלנו גדל בשנה. בואו נסתכל על כמה מהשונויות של פייתון שמגדירים קלאס.
אז בוא נגיד שעכשיו החלטתי שאני רוצה שגם הפרסון שלי חוץ מניים last name ו-age אני גם רוצה שיהיה לו salary. אז אם בשפות כמו Java ו-c-sharp ועוד שפות רבות אחרות הייתם צריכים ללכת לפרסון ולהוסיף פה שורה.
אני יכול פשוט להגיד p.sallary ול-1000. ואני יכול לעשות פה print p.sallary. בואו נראה מה יש לנו. וופס. עכשיו, חלקכם ירימו גבה ותגידו, אבל אתה בעצם משנה קלאס תוך כדי ריצה. ואני אגיד לכם, נכון, כי בפייתון אין בזה בעיה.
כי בעצם אם נסתכל על קלאס בפייתון, אז קלאס זה סוג של דיקשנרי. כמו שאני יכול לשנות דיקשנרי תוך כדי ריצה, אני יכול גם להוסיף לו תוך כדי ריצה. עכשיו, למה זה באמת לא משנה?
כי אם יש לי נגיד פונקציה שאמורה לקבל פרסון, אז בעצם היא מקבלת משהו. היא לא מקבלת, לא כתוב בו פרסון p, זה לא c או java או c++, היא מקבלת p, ואני בתוך הפונקציה שלי אמור לוודא שה-p הזה הוא באמת פרסון ולהתמודד איתו כמו שצריך.
עכשיו, בגלל זה אפשר לעשות את זה. עכשיו, זה שאפשר לעשות את זה, זה לא אומר שצריך לעשות. יש הרבה דברים שאפשר לעשות ולא כל דבר שאפשר לעשות, כדאי לעשות.
להוסיף ערכים לקלאס תוך כדי ריצה זה מאוד מבלבל. אני ממליץ, וככה גם כולם ממליצים, שאת כל השדות שאתם מתכננים לעשות בקלאס, לכתוב אותם פה מפורשות.
שימו לב שאם הדבר הזה היה בהערה, אז השורה הזאת הייתה גורמת לקריסה. בואו נריץ. person object has no attribute salary. כלומר, פייתון אומרת לנו, תקשיב, לפי שלך אין שדה salary.
כלומר, זה שאני יכול להוסיף אותו תוך כדי ריצה, זה לא אומר שאני יכול לנסות לקרוא אותו תוך כדי ריצה. אז אם יש לי טעות כתיב, במקום לעשות p.h שווה ל-1000, אני אעשה p.pge או sge, אז אולי הוספתי שדה חדש שנקרא sge, אבל זה לא אמור לגרום לבאגים רציניים בקוד.
פה סתם נדפיס את dhp, ותראו שנוסף לו אובייקט חדש, sge,