פייתון מונחה עצמים 2: משתנה אובייקט ומשתנה מחלקה

מחבר:
בתאריך:

בפייתון מונחה עצמים ישנם שני סוגי משתנים: משתני אובייקט (instance variables) ומשתני מחלקה (class variables). במדריך זה נסביר ונדגים את שניהם.

 

משתנה אובייקט

במדריך הראשון בסדרת פייתוו מונחה עצמים ראינו דוגמה למשתנה התלוי באובייקט. התלות נוצרה באמצעות המשתנה self אותו נעביר כפרמטר הראשון למתודות, והסיבה שהוא עובד היא כי self מייצג את האובייקט.

בדוגמה הבאה, האובייקטים שניצור מהמחלקה Car נבדלים בתכונה model המוגדרת בנפרד עבור כל אובייקט בעת יצירתו:

class Car:
  def __init__(self, model):
    self.model = model

  def say_hello(self):
       return "Hello, I'm a {}" . format(self.model)

בהתאם, מתודה המשתמשת בתכונה model תספק תוצאה שונה עבור כל אחד מהאובייקטים:

car1 = Car('Tesla')
print(car1.say_hello())

car2 = Car('BMW')
print(car2.say_hello())

התוצאה:

Hello, I'm a Tesla
Hello, I'm a BMW

 

משתנה מחלקה

בעוד משתני אובייקטים יכולים להיות שונים בין האובייקטים. לדוגמה, שם המודל או גילו של אדם. משתני מחלקה יהיו זהים עבור כל האובייקטים כי ערכם מוכתב על ידי המחלקה.

בקלאס Car מספר הגלגלים (num_wheels) אינו תלוי בדגם אז כדאי להגדירו כמשתנה מחלקה. 

את משתני המחלקה נגדיר בתוך הקלאס ומחוץ לכל מתודה.

נוסיף לקלאס את משתנה המחלקה num_wheels (מספר גלגלים):

class Car:
  num_wheels = 4

  def __init__(self, model):
    self.model = model

  def say_hello(self):
       return "Hello, I'm a {}" . format(self.model)

כיוון שהמשתנה שייך למחלקה אנחנו יכולים לגשת אליו ישירות מהמחלקה:

print(Car.num_wheels)
4

כיוון שיש לנו גישה למשתנה אנחנו יכולים לקבוע את ערכו:

Car.num_wheels = 3
print(Car.num_wheels)
3

כפי שניתן לגשת למשתנה מחוץ למחלקה ניתן לגשת אליו גם בתוך המחלקה.

נשנה את קוד המתודה say_hello() כדי שתשתמש במשתנה num_wheels:

class Car:
  num_wheels = 4

  def __init__(self, model):
    self.model = model

  def say_hello(self):
       return "Hello, I'm a {} and I have {} wheels" . format(self.model, Car.num_wheels)

בתוך המתודה say_hello():

  • ניגש למשתנה model בתיווך self מפני שהוא משתנה התלוי באובייקט.
  • ניגש למשתנה num_wheels השייך למחלקה ישירות מתוך המחלקה בגלל שהוא משתנה התלוי במחלקה.

ניצור אובייקט ונקרא למתודה:

car1 = Car('Tesla')
print(car1.say_hello())
Hello, I'm a Tesla and I have 4 wheels

 

משתנה מחלקה בתור מונה

כפי שראינו, משתנה מחלקה שייך למחלקה ומשותף לכל האובייקטים אותם ניצור מהמחלקה. נשתמש בתכונותיו ליצירת מונה.

נוסיף לקלאס את משתנה המחלקה cars_counter שיהווה מונה המתעדכן על פי מספר האובייקטים שיצרנו מהמחלקה.

בתוך המתודה __init__ נוסיף אחד למונה בכל פעם שיוצרים אובייקט מהמחלקה.

class Car:
  cars_counter = 0

  def __init__(self, model):
    self.model = model
    Car.cars_counter += 1

ניצור שלושה אובייקטים מהמחלקה ונראה איך זה משפיע על המספר אותו מציג המונה:

print(f"The number of cars is: {Car.cars_counter}")

car1 = Car('Tesla')
car2 = Car('BMW')
car3 = Car('Mercedes')

print(f"The number of cars is: {Car.cars_counter}")

והתוצאה:

The number of cars is: 0
The number of cars is: 3

המונה עובד. התחלנו מאפס מכוניות וסיימנו עם 3.

 

לסיכום

משתני מחלקה משותפים לכל האובייקטים אותם יוצרים מהמחלקה ומאפשרים לחלוק מידע בין האובייקטים ללא צורך במשתנה גלובלי.

לכל המדריכים בסדרה ללימוד פייתון

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

 

= 6 + 3