פייתון מונחה עצמים 1: מחלקות, אובייקטים, תכונות ומתודות
תכנות מונחה עצמים הוא סגנון כתיבה בו מקבצים את כל המשתנים והפונקציות של נושא מסוים בתוך מחלקה (class). סגנון זה נחשב ליעיל יותר מהסגנון הרגיל (הפרוצדורלי) של תכנות כי הוא גורם לקוד מאורגן יותר, הכולל פחות קוד ופחות חזרות.
בפרויקטים קטנים ופשוטים נוכל להסתפק בסגנון הפרוצדורלי אולם בפרויקטים גדולים, הכוללים מספר מתכנתים או מבוססים על פריימוורקים קיימים נצטרך לקודד בסגנון מונחה עצמים.
מחלקה class
בתכנות מונחה עצמים מקבצים את הקוד של נושא מסוים לתוך מחלקה class. לדוגמה, מחלקה המוקדשת למשתמשים (class User) או לציוצים (class Twit).
ניצור מחלקה של מכוניות (class Car) שתקבץ את כל המשתנים והפונקציות בנושא תחת אותה מחלקה:
class Car:
pass
- כל מילה בשם המחלקה מתחילה באות גדולה. ללא רווחים בין המילים. לדוגמה: OldCar.
תכונות, מתודות ואובייקטים
מחלקות מכילות תכונות (attributes) ומתודות (methods):
- תכונות הם משתנים בתוך מחלקה.
- מתודות הם פונקציות בתוך מחלקה.
מכל מחלקה ניצור אובייקט אחד או יותר. כל האובייקטים יקבלו את התכונות והמתודות של המחלקה. הערכים של התכונות יכולים להיות שונים בין האובייקטים. לדוגמה, אם המחלקה היא User, האובייקט user1 יקבל את השם admin בעוד האובייקט user2 יקבל את השם mogul.
הפרמטר הראשון שמעבירים למתודות הוא בדרך כלל self. ל-self תפקיד מיוחד כיוון שהוא מכיל את האובייקט שקרא למחלקה.
המתודה המיוחדת __init__ ויצירת אובייקטים מהמחלקה
__init__() היא מתודה מיוחדת של פייתון. בכל פעם שניצור אובייקט מהמחלקה, פייתון יריץ את המתודה. שם המתודה מוקף משני צדדיו בקו תחתי כפול כדי לסמן לפייתון שזו מתודת קסם. בהמשך המדריכים, נפגוש מתודות קסם נוספות.
נוסיף למחלקה את המתודה __init__() שתדפיס מסר לשורת הפקודות בכל פעם שיוצרים אובייקט מהמחלקה.
class Car:
def __init__(self):
print('The object was created')
ניצור מהמחלקה Car אוביקט ששמו car1:
car1 = Car()
התוצאה:
The object was created
- הקוד בתוך הפונקציה __init__() רץ ראשון אחרי יצירת האובייקט, והדפיס למסך את ההודעה.
בגלל שהמתודה __init__() רצה ראשונה אחרי יצירת אובייקט מקובל להגדיר בתוכה את התכונות של האובייקט. נגדיר שלאובייקט מכונית יהיו התכונות הבאות:
class Car:
def __init__(self, model, num_wheels, has_sunroof):
self.model = model
self.num_wheels = num_wheels
self.has_sunroof = has_sunroof
- בתוך הפונקציה __init__() הגדרנו את התכונות של האובייקט: שם מודל, מספר גלגלים, גג נפתח.
ניצור אובייקט חדש מהמחלקה Car ונעביר לו את התכונות:
car1 = Car('Tesla', 4, False)
אחרי שיצרנו את האובייקט, אנחנו יכולים לגשת לתכונות שלו:
print(car1.model)
print(car1.num_wheels)
print(car1.has_sunroof)
התוצאה:
Tesla 4 False
אנחנו יכולים גם להגדיר את התכונות של אובייקט קיים. נוסיף לרכב גג נפתח:
car1.has_sunroof = True
אנחנו יכולים ליצור יותר מאשר אובייקט אחד מאותה המחלקה:
car1 = Car('Tesla', 4, False)
car2 = Car('BMW', 4, False)
car3 = Car('Mercedes', 4,True)
ולגשת לתכונות של כל אובייקט בנפרד:
print(car1.model)
print(car2.model)
print(car3.model)
התוצאה:
Tesla BMW Mercedes
הוספת מתודות למחלקה
עד כה ראינו את המתודה המיוחדת __init__() שרצה מיד עם יצירת האובייקט. ניתן להוסיף למחלקה כמה מתודות שצריך. נוסיף למחלקה את המתודה say_hello():
class Car:
def __init__(self, model, num_wheels, has_sunroof):
self.model = model
self.num_wheels = num_wheels
self.has_sunroof = has_sunroof
def say_hello(self):
hav = "have" if self.has_sunroof else "don't have"
msg = "Hello, I'm {} and I {} a sunroof" . format(self.model, hav)
return msg
- נהוג לכתוב את שמות המתודות כשכל האותיות קטנות ובין המילים מפריד קו תחתון. לדוגמה: say_hello
- הפרמטר הראשון במתודה הוא האובייקט שאותו נציין באמצעות self. לא לשכוח לציין את הפרמטר הזה כי גם אם לא מעבירים אותו באמצעות הקריאה למתודה הוא עובר באופן אוטומטי עם פייתון ומאפשר שימוש בתכונות של האובייקט.
- נשתמש ב-self כדי לקרוא לתכונה של האובייקט. לדוגמה: self.model.
ניצור שני אובייקטים ונקרא למתודה:
car1 = Car('Tesla', 4, True)
print(car1.say_hello())
car2 = Car('BMW', 4, False)
print(car2.say_hello())
התוצאה:
Hello, I'm Tesla and I have a sunroof Hello, I'm BMW and I don't have a sunroof
לכל המדריכים בסדרה ללימוד פייתון
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.