פייתון מונחה עצמים 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 כוכבים

 

 

הוסף תגובה חדשה

 

= 3 + 6