בהרצאה זו נלמד על שיעורים, בנאים ותורשה בפיתון.
מושגים אלה חשובים באמת בתוכנית גדולה שבה יש צורך להגדיר סוגים שונים.
חוגים
שיעורים חיוניים בתכנות והם אינם ספציפיים לפייתון. הרבה אחרים שפות תכנות לתמוך ברעיון המעמדות. אנו משתמשים במחלקות כדי להגדיר סוגי נתונים חדשים.
עד כה, למדנו על סוגי הנתונים הבסיסיים ב- Python כמו מספרים, מחרוזות ובוליאנים. אלו הם סוגי הנתונים הבסיסיים או הפשוטים ב- Python. ראינו גם כמה סוגי נתונים מורכבים כמו רשימות ומילונים.
אמנם סוגים אלה שימושיים ביותר, אך לא תמיד ניתן להשתמש בהם למודל של מושגים מורכבים. לדוגמה, חשבו על הרעיון של נקודה, או עגלת קניות. עגלת קניות היא לא בוליאני או רשימה. זה סוג אחר של נתונים. אז אנחנו יכולים להשתמש במחלקות כדי להגדיר טיפוסים חדשים למודל של מושגים אמיתיים.
כעת, בואו נגדיר סוג נתונים חדש בשם נקודה. לסוג החדש הזה יהיו שיטות כפי שבדקנו קודם.
כך תעשה את זה:
אנו מתחילים בהגדרת מחלקה על ידי שימוש במילת המפתח "כיתה" ומיד לאחר מכן אנו נותנים לכיתה שלנו שם.
class Point
עכשיו, תסתכל על מוסכמות השמות שבה השתמשתי כאן. כתבתי באות רישיות את האות הראשונה כאן, זה מה שאנו מכנים מוסכמות שמות פסקל. מוסכמה זו שונה מזו שבה אנו משתמשים למתן שמות למשתנים ולפונקציות שלנו, שעבורן אנו משתמשים תמיד באותיות קטנות ומפרידים מילים מרובות באמצעות קו תחתון. אבל כשנותנים שם למחלקות, אנחנו לא משתמשים בקו תחתון כדי להפריד בין מילים מרובות במקום זאת, אנחנו משתמשים באות הראשונה של כל מילה באות רישיות.
לאחר הגדרת המחלקה שלנו, נעשה שימוש בנקודתיים מה שאומר שכעת מוגדר בלוק.
class Point:
def move (self):
בבלוק זה נוכל להגדיר את כל הפונקציות או המתודות השייכות לנקודות. לדוגמה, אנו יכולים להגדיר פונקציה הנקראת "זוז" להזזת נקודה. שימו לב שברגע שאנו מקלידים סוגריים פתוחים, PyCharm מוסיף כאן אוטומטית "עצמי". זוהי מילת מפתח מיוחדת ותן לי לחזור אליה בקרוב. בואו נדפיס "זוז" בטרמינל.
print("move")
בוא נגדיר שיטה אחרת כמו "צייר" ונדפיס אותה בטרמינל.
def draw(self):
print("draw")
סיימנו עם ההגדרה של מחלקה "נקודה" שלנו. עם הסוג החדש הזה, נוכל ליצור אובייקטים חדשים. מחלקה פשוט מגדירה את השרטוט או את התבנית ליצירת אובייקטים שהם המופעים בפועל המבוססים על השרטוט הזה. כדי ליצור אובייקט, אנו מקלידים את שם המחלקה שלנו ואז קוראים לו בדיוק כמו פונקציה. זה יוצר אובייקט חדש ואז מחזיר אותו. אז נוכל לאחסן את האובייקט הזה במשתנה. תן לי להראות לך:
כאן הגדרנו "נקודה1" שהיא נקודה תלת מימדית. אתה יכול לראות את זה, אנחנו יכולים להדפיס קואורדינטות בודדות בטרמינל.
אנו יכולים להשתמש בשתי השיטות "לצייר" ו"לזוז" עם נקודה זו.
אז לסיכום, אנחנו משתמשים במחלקות כדי להגדיר טיפוסים חדשים ולטיפוסים האלה יכולים להיות מתודות שאנחנו מגדירים בגוף המחלקה. לשיעורים יכולים להיות תכונות שאנו יכולים להגדיר בכל מקום בתוכניות שלנו.
קונסטרוקטורים
עד כה, למדנו כיצד ליצור סוגים חדשים באמצעות שיעורים. כעת יש בעיה קטנה ביישום זה. אנו יכולים ליצור אובייקט נקודתי ללא קואורדינטת x או y באמצעות מחלקות וזה לא אידיאלי. תן לי להראות לך.
בואו ניצור נקודה ונדפיס אותה לפני שנקבע את קואורדינטת ה-x. הפעלת התוכנית שלנו גורמת לשגיאת תכונה כמו זו:
זה אומר שלאובייקט הנקודתי אין תכונה שנקראת x. עכשיו הבעיה היא שאפשר לקבל אובייקט נקודתי ללא קואורדינטות x או y. זה לא הגיוני שכן בכל פעם שאנחנו מדברים על נקודה, אנחנו צריכים לדעת איפה הנקודה הזו ממוקמת. כדי לפתור בעיה זו, אנו משתמשים בקונסטרוקטור. קונסטרוקטור הוא פונקציה שנקראת בזמן יצירת אובייקט.
הנה איך אנחנו משתמשים בקונסטרוקטור. ראשית, נעביר את ערכי הקואורדינטות x ו-y בתוכנית לעיל.
point = Point(10, 20)
print(point.x)
כעת, עלינו להוסיף שיטה מיוחדת במחלקה הזו שנקראת בנאי. התחביר שלו הוא כזה:
def __init__(self, x, y):
init
הוא קיצור של initialized, וזו הפונקציה או השיטה שנקראת כאשר נוצר אובייקט נקודתי חדש. ה-x וה-y מתווספים מיד לאחר מכן self
כדי להוסיף שני פרמטרים נוספים.
לאחר מכן, עלינו למפות את ה-x וה-y לערכים שעברו, כלומר 10 ו-20
self.x = x
self.y = y
אנו משתמשים self
להתייחס לאובייקט הנוכחי ואז אנו מגדירים את תכונת x לארגומנט x המועבר לפונקציה "x". בדרך זו, באמצעות init
שיטה, נוכל לאתחל את האובייקטים שלנו. שיטה זו מכונה בנאי. בואו להפעיל את התוכנית שלנו.
כעת, נוכל לשנות את קואורדינטות x ו-y מאוחר יותר. בואו נעדכן את קואורדינטת x:
point = Point(10, 20)
point.x = 11
print(point.x)
כעת, קואורדינטת x מעודכנת לערך 11.
תרגיל
הנה תרגיל מעניין בשבילך.
אני רוצה שתגדיר טיפוס חדש שנקרא אדם. לאובייקטים "אדם" אלה צריך להיות "name
" תכונה וכן "talk()
" שיטה.
זו משימה פשוטה ולא אמורה לקחת יותר מכמה דקות.
פתרון
התחל עם הגדרת הכיתה "אדם" כך:
class Person:
self.name = name
נגדיר את הקונסטרוקטור מאוחר יותר. כעת, אנו יכולים ליצור את האובייקט "אדם". בואו נקרא לזה ג'ון
john = Person("John Smith")
print(john.name)
john.talk()
כעת, המשך לחלק הראשון של הקוד וצור בנאי.
def __init__(self, name):
הקוד הסופי ייראה כך:
אתה יכול גם להשתמש במחרוזות מעוצבות ובמושגים אחרים בשילוב עם מחלקות ובנאים.
יְרוּשָׁה
ירושה הוא מושג נוסף הקשור לשיעורים המאפשרים לך לעשות שימוש חוזר בקוד.
שקול את קטע הקוד הזה.
class Dog:
def walk(self):
print("walk")
יצרנו כיתת "כלב" בשיטת "הליכה". בשיטה זו, אנו פשוט מדפיסים את הודעת ההליכה בטרמינל. נניח, בתוכנית אמיתית, יש כאן 10 שורות קוד במקום רק שורה אחת. בעתיד, אם יהיה צורך במחלקה נוספת שתהיה לו שיטת "הליכה", נצטרך לחזור על כל הקוד הזה. זה לא אידיאלי.
בתכנות, יש לנו עיקרון שנקרא DRY שהוא קיצור של אל תחזור על עצמך. נניח שמתישהו בעתיד, אנו מגלים בעיה בשיטת ה"הליכה" שלנו ואם חזרנו או שכפלנו את השיטה הזו במקומות רבים אחרים, נצטרך לחזור ולתקן את הבעיה בכל מקום שבו שכפלנו את זה. קוד. אז זו הסיבה שבתכנות אנחנו לא צריכים להגדיר משהו פעמיים.
ישנן גישות שונות לתיקון בעיה זו, אך כאן אנו הולכים ללמוד את זו שקל יותר למתחילים והיא נקראת ירושה. במקרה זה, ניצור "יונק" מחלקה נוספת ונגדיר את תכונת "הליכה" שלנו בכיתה זו.
class Mammal:
def walk(self):
print("walk")
לאחר הגדרת המחלקה "יונק" שלנו, נוכל להשתמש בירושה כדי להעביר את התכונות כך:
גם כיתות הכלב וגם החתולים יורשים את כל שיטות המחלקה המוגדרות בכיתת האב שלהם. כעת, אנו יכולים להוסיף שיטות ספציפיות לכלבים כמו זה:
class Dog:
def bark(self):
print("bark")
לעטוף!
הכל היה על המחלקות, הבנאים ושימוש חוזר בקוד במחלקות עם מושגי ירושה. עכשיו אנחנו לקראת סיום הסדרה שלנו. בשלב זה, אתה אמור להיות מסוגל לייצר קודים טובים, קריאים ותמציתיים ב-Python.
את הרעיון של מודולים וחבילות נראה בהרצאה הבאה.
השאירו תגובה