שיטות קסם בפייתון
מאמר זה מסביר את שיטות הקסם בפייתון.
YouTube Video
שיטות קסם בפייתון
שיטות קסם (שיטות מיוחדות) בפייתון הן שיטות עם שמות מיוחדים שנועדו להעניק למחלקות התנהגות ייחודית. לדוגמה, הן מאופיינות בכך שהן מוקפות בקווים תחתונים כפולים (dunders), כמו __init__
ו-__str__
. לכן הן נקראות גם שיטות dunder.
באמצעות הגדרת שיטות קסם, ניתן להתאים את ההתנהגות הסטנדרטית של מחלקות. לדוגמה, הגדרת __add__
מאפשרת לשנות את ההתנהגות של אופרטור החיבור +
.
שיטות קסם לאתחול והצגת מחרוזת
__init__
: שיטת אתחול
המתודה __init__
היא קונסטרקטור הנקרא אוטומטית כאשר נוצר מופע.
1class Person:
2 def __init__(self, name, age):
3 self.name = name
4 self.age = age
5
6person = Person("Alice", 30)
7print(person.name) # Alice
__str__
: ייצוג מחרוזת קריא לאדם
המתודה __str__
מחזירה ייצוג מחרוזת קריא לאדם. היא מופעלת באמצעות print()
ו-str()
.
1class Person:
2 def __init__(self, name):
3 self.name = name
4
5 def __str__(self):
6 return f"Person: {self.name}"
7
8person = Person("Bob")
9print(person) # Person: Bob
__repr__
: ייצוג מחרוזת למטרות ניפוי שגיאות
המתודה __repr__
מחזירה ייצוג מחרוזת שנועד לניפוי תקלות. היא משמשת את repr()
וכאשר מוצגים הערכים בפרשן (Interpreter).
1class Person:
2 def __init__(self, name):
3 self.name = name
4
5 def __repr__(self):
6 return f"Person(name={self.name!r})"
7
8person = Person("Eve")
9print(repr(person)) # Person(name='Eve')
העמסת אופרטורים חשבוניים
__add__
: אופרטור +
באמצעות שימוש בשיטות קסם ניתן להעמיס אופרטורים חשבוניים. לדוגמה, המתודה __add__
מאפשרת העמסה של אופרטור החיבור +
.
1class Vector:
2 def __init__(self, x, y):
3 self.x = x
4 self.y = y
5
6 def __add__(self, other):
7 return Vector(self.x + other.x, self.y + other.y)
8
9 def __repr__(self):
10 return f"Vector({self.x}, {self.y})"
11
12 # Other arithmetic magic methods:
13 # def __sub__(self, other): # Subtraction (-)
14 # def __mul__(self, other): # Multiplication (*)
15 # def __truediv__(self, other): # True division (/)
16 # def __floordiv__(self, other): # Floor division (//)
17 # def __mod__(self, other): # Modulo (%)
18 # def __pow__(self, other): # Exponentiation (**)
19
20v1 = Vector(1, 2)
21v2 = Vector(3, 4)
22print(v1 + v2) # Vector(4, 6)
שיטות קסם נוספות לאופרטורים חשבוניים כוללות את הבאות:.
שיטה | אופרטור |
---|---|
__add__ |
+ |
__sub__ |
- |
__mul__ |
* |
__truediv__ |
/ |
__floordiv__ |
// |
__mod__ |
% |
__pow__ |
** |
התאמת אופרטורי השוואה
ניתן גם להעמיס אופרטורי השוואה. לדוגמה, המתודה __eq__
מעמיסה את אופרטור השוויון.
1class Box:
2 def __init__(self, volume):
3 self.volume = volume
4
5 def __eq__(self, other):
6 return self.volume == other.volume
7
8 def __lt__(self, other):
9 return self.volume < other.volume
10
11 # Comparison magic methods:
12 # def __eq__(self, other): # Equal to (==)
13 # def __ne__(self, other): # Not equal to (!=)
14 # def __lt__(self, other): # Less than (<)
15 # def __le__(self, other): # Less than or equal to (<=)
16 # def __gt__(self, other): # Greater than (>)
17 # def __ge__(self, other): # Greater than or equal to (>=)
18
19b1 = Box(100)
20b2 = Box(200)
21
22print(b1 == b2) # False
23print(b1 < b2) # True
קיימות גם שיטות קסם נוספות:. שיטות קסם אלו מגדירות השוואות כמו שוויון וסדר בין אובייקטים.
אופרטור | שיטת קסם |
---|---|
== |
__eq__ |
!= |
__ne__ |
< |
__lt__ |
<= |
__le__ |
> |
__gt__ |
>= |
__ge__ |
שיטות קסם לסוגי מכולות (Container)
ניתן ליצור מחלקות שמתנהגות כמו רשימות או מילונים.
__len__
: קבלת מספר האלמנטים
המתודה __len__
היא שיטת קסם שמחזירה את מספר האלמנטים.
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __len__(self):
6 return len(self.items)
7
8basket = Basket(["apple", "banana"])
9print(len(basket)) # 2
__getitem__
: גישה לפי אינדקס
המתודה __getitem__
מופעלת כאשר משתמשים בגישה לפי אינדקס.
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __getitem__(self, index):
6 return self.items[index]
7
8basket = Basket(["apple", "banana"])
9print(basket[1]) # banana
__setitem__
ו-__delitem__
: כתיבה ומחיקה
המתודות __setitem__
ו-__delitem__
מופעלות כאשר כותבים או מוחקים פריטים.
1class Basket:
2 def __init__(self, items):
3 self.items = items
4
5 def __setitem__(self, index, value):
6 self.items[index] = value
7
8 def __delitem__(self, index):
9 del self.items[index]
10
11basket = Basket(["apple", "banana"])
12basket[1] = "grape"
13del basket[0]
14print(basket.items) # ['grape']
שיטות קסם לחזרה (איטרציה)
כדי לאפשר לאובייקט איטרציה בלולאת for
, יש לממש את הבאות:.
__iter__
ו-__next__
1class Counter:
2 def __init__(self, limit):
3 self.limit = limit
4 self.current = 0
5
6 def __iter__(self):
7 return self
8
9 def __next__(self):
10 if self.current >= self.limit:
11 raise StopIteration
12 self.current += 1
13 return self.current
14
15for num in Counter(3):
16 print(num)
17# Output:
18# 1
19# 2
20# 3
מנהל הקשר (Context Manager) (with
)
באמצעות הגדרת המתודות __enter__
ו-__exit__
ניתן לממש פעולות לפני ואחרי בפעולת with
.
1class FileOpener:
2 def __init__(self, filename):
3 self.filename = filename
4
5 def __enter__(self):
6 self.file = open(self.filename, 'r')
7 return self.file
8
9 def __exit__(self, exc_type, exc_val, exc_tb):
10 self.file.close()
11
12with FileOpener("example.txt") as f:
13 content = f.read()
14 print(content)
אובייקטים שניתן לקרוא להם: __call__
על ידי הגדרת המתודה __call__
אפשר לאפשר למופע להתנהג כפי שפונקציה קוראים לה.
1class Greeter:
2 def __init__(self, greeting):
3 self.greeting = greeting
4
5 def __call__(self, name):
6 return f"{self.greeting}, {name}!"
7
8hello = Greeter("Hello")
9print(hello("Alice")) # Hello, Alice!
סיכום
שיטות קסם בפייתון הן דרך עוצמתית להוסיף התנהגות טבעית ואינטואיטיבית למחלקות. לכל שיטה יש מטרה ברורה, ומימוש נכון שלהן מאפשר לכתוב קוד גמיש ו'פייתוני' יותר.
שיטות הקסם משמשות כ'ממשק בלתי נראה' התומך באופן שבו אובייקטי פייתון פועלים ומתקשרים מאחורי הקלעים.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.