קישור לחלק ראשון – היכרות עם פייתון: עבודה עם סוגי נתונים.
קישור לחלק השני – רצף תוכנית פייתון.
קישור לחלק השלישי – פונקציות.
תרגילים.
Class הוא ביטוי בסיסי בשפות מונחות עצמים כמו Python. הוא משמש לאיסוף של תכונות ופונקציות תחת שם אחד שמרכז אותם. Class מדמה עצמים כמו שהם נמצאים בעולם האמיתי. אפשר להסתכל על Class כעצם שיש לו מידע והתנהגות שהוא מאחסן. ה-Class הוא רק המבנה שמאחסן את הנתונים. כדי להשתמש בו צריך ליצור מופע שלו.
כדי להבין נקח לדוגמא מצולע. למצולע יש מספר צלעות ואפשר לחשב את השטח שלו. Class של מצולע יכיל את המידע של מספר הצלעות ויתן לי פונקציה שאיתה אוכל לחשב את השטח. ההגדרה תהיה הגדרה כללית של מצולע. אין לי באמת אחד כזה.
עם ההגדרה הכללית אני יכולה ליצור בפועל מצולע עם 3 צלעות, שהתכונה של הצלעות תהיה שווה אצלו ל-3 ויהיה לו חישוב של השטח שלו. אני יכולה ליצור גם מצולע אחר שבו תכונת הצלעות תהיה שווה ל-4.
דבר משמעותי נוסף שיש לנו ב-Class זה אפשרות הירושה. אני יכולה לרשת מ-Class המצולע שלי וליצור Class חדש בשם משולש. המשולש הוא סוג של מצולע. גם בו יהיה לי מידע על מספר הצלעות וחישוב של השטח שלו, אבל אני אוכל להתאים אותם בצורה יותר מדוייקת לצורה הספציפית.
הגדרה של Class
בדוגמא יש מעגל. למעגל יש תכונה של radius ואפשרות לחישוב השטח עם פונקציית calculate_area. הפונקציה לא צריכה לקבל מחדש את radius כשקוראים לה, היא מכירה אותו כבר כי הוא חלק מה-Class שלה.
import math
class Circle:
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return round(math.pi * self.radius ** 2, 2)
יצירת אובייקט
אחרי שיש לנו הגדרה של class ניצור אובייקט circle_1 מסוג Circle שבו הרדיוס שווה ל-42. ה-Circle קורה לפונקציית הבנייה שלו שנקראת constructor וההגדרה שלה היא __init__. שם הוא מאחסן את המספר 42 בתכונת ה-radius שלו.
בהגדרת ה-constructor הוא מצפה לקבל מספר כדי לאחסן אותו ב-radius.
circle_1 = Circle(42)
גישה למשתני האובייקט
כדי לגשת למשתנים והפונקציות של האובייקט משתמשים בנקודה.
import math
class Circle:
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return round(math.pi * self.radius ** 2, 2)
circle_1 = Circle(42)
print(circle_1.radius)
print(circle_1.calculate_area())
מוסכמות בהגדרת Classes
כשמגדירים class השם שלו תמיד יתחיל באות גדולה. אם יש כמה מילים ב-class כל מילה תתחיל באות גדולה. למשל: SomeClassName. בניגוד למשתנים שתמיד יתחילו באות קטנה.
מקובל לאחסן את ה-class בקובץ משלו ולא בקובץ הראשי של התוכנית. למשל בדוגמא שלנו ניצור קובץ בשם Circle.py ובו יהיה התוכן של ה-class. לקובץ הזה נקרא בתוכנית הראשית.
קובץ circle.py
# circle.py
import math
class Circle:
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return round(math.pi * self.radius ** 2, 2)
כדי שהתוכנית הראשית תכיר את Circle נשתמש ב-import.
תוכנית ראשית
from circle import Circle
circle_1 = Circle(42)
print(circle_1.radius)
print(circle_1.calculate_area())
ירושה
אחת התכונות של class היא ירושה. אנחנו מגדירים class בסיס והשאר יורשים ממנו. נניח שיש לנו class צורה ויורש ממנו class של ריבוע. היחס ביניהם הוא שריבוע הוא צורה. נוכל להגדיר class שיורש בשם משולש. גם משולש הוא צורה.
בדוגמא יש לנו class Shape יש לו תכונה של type שהיא מוגדרת עם הערך Shape.
class Shape:
def __init__(self):
self.type = 'Shape'
כדי לקצר את ההדפסה של מה שיש לנו בתוך class אפשר להגדיר פונקציה שמורה בשם __str__. בכל פעם שנדפיס את תוכן ה-class נקבל את מה שמחזירה הפונקציה הזאת. בדוגמא, אם נדפיס את ה-class נקבל את ה-type שלו.
class Shape:
def __init__(self):
self.type = 'Shape'
def __str__(self):
return "This is a shape of type {}.".format(self.type)
# Create Shape insrtance
objShape = Shape()
print(objShape)
# Output: This is a shape of type Shape.
אחרי שיש לנו את class הבסיס, נגדיר את היורשים שלו. את ה-class שממנו אנחנו יורשים נשים בסוגריים בהגדרת ה-class.
אנחנו משנים את התוכן של type, מוסיפים משתנים אחרים ומגדירים גם פונקציה חדשה. ה-class היורש יכיל את מה שהיה ב-class האב בתוספת מה שיש לו.
אפשר לראות שיצרנו class חדש וביצירת המופע שלו אנחנו משתמשים בפונקציית ההדפסה. הפונקציה הזאת לא קיימת ב-class החדש שיצרנו, אם אין לו את הפונקציה הוא הולך לאבא ומחפש אותה שם. מכיוון שהיא קיימת הוא משתמש בה.
class Rectangle(Shape):
def __init__(self, length, width):
self.type = 'Rectangle'
self.length = length
self.width = width
def calculate_area(self):
return self.length * self.width
objRectangle = Rectangle(10, 20)
print(rectangleObject)