טיפוסיות ברווז
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 נעשה גמיש, והוא פועל לפי העיקרון „קל יותר לבקש סליחה מאשר רשות”.
אתגר
בינוניבאתגר הזה תממשו מערכת המדגימה טיפוסיות ברווז עם אובייקטים שונים דמויי קובץ:
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")השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים (OOP)
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםהפרמטר selfמתודותמאפייניםשיטת הבנאי (__init__)חזרה: מחשבון פשוט5פולימורפיזם
בחינה מחדש של דריסת מתודותטיפוסיות ברווזמחלקות ומתודות אבסטרקטיותעיצוב ממשקיםסיכום – מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה לעומת הורשהMixinsמתודות סטטיות ומתודות מחלקהדקורטורים למחלקותמנהלי הקשרתרגלו בעצמכם: קומפיילר Python אונליין