פייתון/פייתון גרסה 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

קישורים חיצוניים[עריכה]