ירושה

February 20, 2019

ירושה

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

 

class Store:

    def __init__(self, size, adr):
        self.size = size
        self.adr = adr
        self.balance=0
    def __str__ (self):
        return self.adr

    def add (self,num):
      self.balance +=num


    def sub (self,num):
      self.balance -=num

stim=Store(150,"brodetsky 15 Or Yeuda")

print(stim.balance)                                      >>>   0
stim.add(500)
print(stim.balance)                                      >>>   500
stim.sub(300)
print(stim.balance)                                      >>>   200
print(stim)                                                     >>>   brodetsky 15 Or yeuda

 

 

למעלה אנו רואים מחלקה (class) רגילה שנקראת Store היא יודעת לייצר מופעים (instance) כמו זה שיצרנו וקראנו לו stim היא מקבלת שני פרמטרים , גודל החנות וכתובתה. והיא יודעת להוסיף ולחסר סכומים ממאזן החנות שהוגדר על ידנו כ- self.balance.

כעת נניח שאנחנו רוצים לבנות תת מחלקה של סופרמרקט Supermarket שהיא גם סוג של חנות Store על כל המאפיינים של החנות בשינוי אחד בלבד, והוא שבסופר מרקט מעניין אותנו גם כמה מקומות חניה צמודים אליו. כל יתר המאפיינים זהים. לכן במקום לכתוב את הקוד עבור מחלקת Supermarket מחדש, אנו יורשים ממחלקת Store את כל המאפיינים שאנו צריכים ומוסיפים פרמטר נוסף של מקומות חניה parknum. נראה איך זה עובד -

 

class Store:
    def __init__(self, size, adr):
        self.size = size
        self.adr = adr
        self.balance=0
    def __str__ (self):
        return self.adr

    def add (self,num):
      self.balance +=num

    def sub (self,num):
      self.balance -=num


class Supermarket(Store):
  def __init__(self, size, adr,parknum):
    Store.__init__(self,size,adr)
    self.parknum=parknum

ampm=Supermarket(400,"hashalom 45 ramalla",50)
ampm.add (320)
ampm.sub(150)
print (ampm.parknum)                            >>>   50
print (ampm.balance)                              >>>   170
print(ampm)                                             >>>   hashalom 45 ramalla

 

כתבנו את מילת המפתח class ובחרנו שם כמו בכל מחלקה רגילה Supermarket .  אבל הפעם הכנסנו לתוך הסוגריים הצמודים לשם המחלקה, גם את שם המחלקה ממנה אנו רוצים לרשת את התכונות, במקרה שלנו Store. בנוסף הכנסנו תחת הפונקציה המיוחדת __init__ שלושה פרמטרים אשר מעניינים אותנו כאשר מדובר בסופרמרקט size, adr ,parknum גודל החנות, הכתובת שלה, ומספר מקומות החניה הצמודים לסופרמרקט (פרמטר שאינו מעניין כאשר מדובר בחנות באופן כללי).

בנוסף, על מנת שנוכל להעביר ל- Supermarket את התכונות של Store אנו צריכים להוסיף את שורת ה- __init__ של המחלקה ממנה יורשים - (Store.__init__(self,size,adr וזהו.

עכשיו ניצור מופע של סופרמרקט בשם ampm, שטחו 400 מ"ר, והוא נמצא ברחוב hashalom ויש לו 50 מקומות חניה צמודים.

והנה הדבר המדהים, אנו יכולים להוסיף ולהחסיר סכומים ממאזן הסופרמרקט, דבר שאינו מופיע בכלל באופן גלוי בקוד המחלקה Supermarket , לבקש לראות את המאזן שלו (balance) ולראות את שם הסופרמרקט – הכל מבלי שהיינו צריכים לקודד שום דבר מהדברים האלה במחלקה החדשה, שירשה את כל התכונות הללו ישירות ממחלקת Store. זה הסיפור חסכון בשורות קוד.

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

Please reload

Please reload

רעננו את הדף והקליקו למעבר לנושא הבא: