פייתון/פייתון גרסה 3/רשימת מתודות
בכל המחלקות בפיתון מוגדרות מתודות שמאפשרות לפייתון לאפשר קיומם של פונקציות מובנות (להרחבה ראה, פולימורפיזם).
פונקציות | סוג | הסבר | דוגמה |
---|---|---|---|
__str__ | מתודה המחזירה רשימה של המחלקה ומאפשרת לפונקצית Print להדפיס את ערכים של אובייקט. |
אם נבצע הדפסה לאובייקט נקבל את מיקום בזיכרון: class Animals:
def __init__(self, name, leg):
self.name = name
self.leg = leg
animal = Animals('dog', 4)
>>>print(animal)
<__main__.Animals object at 0x033222D0>
הראנו בפרק על מחלקות כי ניתן לבצע הדפסה על ידי קריאה לאובייקט וקריאה למופע המחלקה: >>>print(animal.name)
בכדי שנוכל לממש פלורליזם, להשתמש בפונקצית print לדוגמה על האובייקט, נהוג לבצע פונקציה המחזירה את ערכי השדה עם השם __str__: class Animals:
def __init__(self, name, leg):
self.name = name
self.leg = leg
def __str__(self):
return self.name
def __del__(self):
return 'the object is removed'
animal_1 = Animals('dog', 4)
print(animal)
>>>dog
עתה כשבקשנו לבצע הדפסה של האוביקט קבלנו את שמו. שמו לב שבמידה ונרצה להחזיר שני ערכים יתכן שנתקל בבעיה: class Animals:
def __init__(self, name, leg):
self.name = name
self.leg = leg
def __str__(self):
return self.name, self.leg
animal = Animals('dog', 4)
>>>print(animal)
>>> TypeError: __str__ returned non-string (type tuple)
#we might called to the function
print(animal.__str__())
פייתון מזהה את ערך ההחזרה כלא מחרוזת ולכן אינה יכולה להדפיס את הערכים. תיקון ראשון אפשרי, שאינו יעיל במיוחד, הוא לקרוא מפורשות לפונקציה ולקבל את ערכי ההחזרה. במקרה זה פייתון לא תחזיר מחרוזות ולא נוכל להשתמש ב-print. אפשרות התיקון האפשרית היא להמיר את הערכים שאינם מחרוזת למחרוזת: class Animals:
def __init__(self, name, leg):
self.name = name
self.leg = leg
def __str__(self):
return self.name + ' ' + str(self.leg)
def __del__(self):
return 'the object is removed'
animal_1 = Animals('dog', 4)
print(animal)
>>>dog 4
| |
__repr__ | פונקצית repr דומה מאוד לפונקצית str. הפונקציה מגדירה לפיתון כיצד להציג אובייקט. לכן פעמים רבות מחזירה מחרוזת של המחלקה. לעיתים גם נתונים נוספים כגון מידע זיכרון ועוד (ראה פונקצית bulid in repr). | class Play(object):
def __init__(self, score):
self.score = score
def __lt__(self, other):
return self.score < other.score
def __repr__(self):
return str(self.score)
lst = [Play(3), Play(1), Play(2)]
lst.sort()
print(lst)
>>>[1, 2, 3]
לעומת זאת כאשר נעזר בפונקצית מחרוזת נקבל: class Play(object):
def __init__(self, score):
self.score = score
def __lt__(self, other):
return self.score < other.score
def __str__(self):
return str(self.score)
lst = [Play(3), Play(1), Play(2)]
lst.sort()
print(lst)
>>>[<__main__.Play object at 0x033C2770>, <__main__.Play object at 0x033C28F0>, <__main__.Play object at 0x033C2270>]
זאת כיוון שהמתודה מחרוזת היא עבור פונקצית הדפסה ולעומת זאת repr אחראית לתצוגה באופן כללי. | |
__del__() | פונקציה שמוחקת אוביקטים | להבדיל מכל יתר המתודות פונקציה זו נרשמת לפני האובייקט ולא אחריו:
class Animals:
def __init__(self, name, leg):
self.name = name
self.leg = leg
def __str__(self):
return self.name + ' ' + str(self.leg)
def __del__(self):
return 'the object is removed'
animal = Animals('dog', 4)
print(animal)
del animal
print(animal)
>>>NameError: name 'animal' is not defined
| |
__next__ | בכדי לאפשר הפעלה של פונקצית next אוביקט חייב להכיל בתוכו את פונקצית __next__ | ||
super().__init__ | הורשה | ||
__iter__ | מתודה המאפשר להשתמש בפונקצית iter | ||
__contains__ | |||
__eq__ | class Point():
def __init__(self, x, y):
self.__x = x
self.__y = y
def __eq__(self, other):
return self.__x == other.__x and \
self.y == other.__y
point_1 = Point(3,4)
point_2 = Point(4,4)
print(point_1 == point_2)
>>>False
| ||