פייתון/פייתון גרסה 2/מחלקות/זמני
פרק זה לוקה בחסר. אתם מוזמנים לתרום לוויקיספר ולהשלים אותו. ראו פירוט בדף השיחה.
מחלקה (class) הינה יישות תכנותית, שממבט ראשון ניתן לתאר אותה כטיפוס משתנה מורחב. עד כה השתמשנו בהשמות כגון:
>>> a=3; type(a)
<type 'int'>
>>> b=3.0; type(b)
<type 'float'>
>>> c=[3,0]; type(c)
<type 'list'>
אבל מה אם ברצוננו לאחסן קוארדינטות של נקודה? מערך נקודות? משולש? לשם כך נגדיר "טיפוס" חדש:
class Point:
def __init__(self,x,y):
self.x=x
self.y=y
# Main:
p=Point(3.0,4.0)
print p.x,p.y
מבחינת מתכנת שמשתמש במחלקה Point, כל שעליו לעשות הוא להצהיר על משתנה מסוים כ-"Point", ולהעביר ערכים התחלתיים (לא חייבים - אפשר לאתחל מאוחר יותר).
מבחינת המחלקה, עלינו להגדיר פונקציה מיוחדת, הנקראת __init__ ובתוכה לכתוב את כל פעולות האתחול שברצוננו לבצע ברגע שבו המתכנת מצהיר על משתנה כ-Point. פונקציה מיוחדת זו נקראת פונקציה בונה (constructor).
על מנת ליצור משתנים "פנימיים", חייבים להשתמש במילה השמורה "self".
כעת נרצה להשתמש במחלקה Point כדי להגדיר את האוביקטים "ישר" ו"משולש":
class Line:
def __init__(self,p1,p2):
self.p1=p1
self.p2=p2
def Length(self):
return sqrt((self.p1.x-self.p2.x)**2 + (self.p1.y-self.p2.y)**2)
class Triangle:
def __init__(self,p1,p2,p3):
self.p1=p1
self.p2=p2
self.p3=p3
l1 = Line(self.p1,self.p2)
l2 = Line(self.p2,self.p3)
l3 = Line(self.p3,self.p1)
self.a = l1.Length()
self.b = l2.Length()
self.c = l3.Length()
def Perimeter(self):
return self.a+self.b+self.c
def Area(self):
p = 0.5*self.Perimeter() # Semiperimeter
# Heron's formula:
return sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
>>> from math import sqrt
>>> x=Point(0.0,0.0)
>>> y=Point(3.0,0.0)
>>> z=Point(3.0,4.0)
>>> T=Triangle(x,y,z)
>>> print T.Area()
6.0
כדאי לדעת: גם הרשימה (list) מוגדרת באמצעות מחלקה. |
המשתנה self
[עריכה]המשתנה self עלול להיות מבלבל. במובן מסוים זהו "מצביע" ל-instance. מספר דגשים:
- כל פונקצה במחלקה חייבת לכלול את self כפרמטר.
- כשקוראים לפונקצית מחלקה אין להעביר את self כפרמטר.
הכללה
[עריכה]באופן טבעי נרצה להגדיר אוביקט כללי יותר, הלא הוא המצולע (פוליגון). כעת, משהנחנו את היסודות ניתן להמשיך הלאה.