Menu
Coddy logo textTech

טיפוסיות ברווז

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Python של Coddy. שיעור 24 מתוך 64.

הקלדה ברווזית מתמקדת במה שאובייקט יכול לעשות, ולא במה שהוא. אם יש לאובייקט את המתודות הדרושות לך, אפשר להשתמש בו — בלי קשר לסוג המחלקה שלו.

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

class Duck:
    def swim(self):
        return "Duck swimming"
    
    def quack(self):
        return "Quack!"

class Person:
    def swim(self):
        return "Person swimming"
    
    def quack(self):
        return "Person imitating a duck: Quack!"

שימו לב ש-Duck ו-Person לא יורשים מאותה מחלקת אב, אבל לשניהם יש את המתודות swim() ו-quack().

צרו פונקציה שעובדת עם כל אובייקט דמוי־ברווז:

def make_it_swim_and_quack(duck_like_object):
    print(duck_like_object.swim())
    print(duck_like_object.quack())

לפונקציה הזו לא משנה מהו סוג האובייקט — חשוב לה רק שלאובייקט יהיו המתודות הנדרשות.

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

make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())

פלט:

Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!

הוסיפו מחלקה נוספת ״דמוית ברווז״:

class Robot:
    def swim(self):
        return "Robot swimming with propellers"
    
    def quack(self):
        return "Robot sound: BEEP BEEP!"

make_it_swim_and_quack(Robot())

פלט:

Robot swimming with propellers
Robot sound: BEEP BEEP!

נקודה חשובה: הקלדה דינמית מאפשרת פולימורפיזם ללא ירושה. אם לאובייקט יש את המתודות הדרושות לך, אפשר להשתמש בו. כך קוד Python נעשה גמיש, והוא פועל לפי העיקרון „קל יותר לבקש סליחה מאשר רשות”.

challenge icon

אתגר

בינוני

באתגר הזה תממשו מערכת המדגימה טיפוסיות ברווז עם אובייקטים שונים דמויי קובץ:

  • textfile.py: ממשו את המחלקה TextFile עם המתודות read() ו־write(data)
  • database.py: ממשו את המחלקה Database עם חתימות מתודות תואמות
  • networkresource.py: ממשו את המחלקה NetworkResource עם חתימות מתודות תואמות
  • driver.py - ממשו מקרי בדיקה שיוודאו שהמימוש שלכם פועל כראוי

כל קובץ מכיל הערות TODO מפורטות שמנחות אתכם במימוש.

נסו בעצמכם

# TODO: ייבאו את המחלקה TextFile מתוך textfile.py
# TODO: ייבאו את המחלקה Database מתוך database.py
# TODO: ייבאו את המחלקה NetworkResource מתוך networkresource.py

def process_data(data_source, data):
    # TODO: קראו למתודה read() של data_source והדפיסו את התוצאה
    # TODO: קראו למתודה write(data) של data_source והדפיסו את התוצאה
    pass


# בדיקה עם מקורות נתונים שונים - אין לשנות את קוד הבדיקה הזה
text_file = TextFile()
database = Database()
network = NetworkResource()

print("Processing text file:")
process_data(text_file, "Hello, world!")

print("\
Processing database:")
process_data(database, "User record")

print("\
Processing network resource:")
process_data(network, "GET request")
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Python אונליין